I’d like to run a process and not wait for it to return. I’ve tried spawn with P_NOWAIT and subprocess like this:
app = "C:WindowsNotepad.exe"
file = "C:PathToFile.txt"
pid = subprocess.Popen(
[app, file],
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
).pid
However, the console window remains until I close Notepad. Is it possible to launch the process and not wait for it to complete?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
This call doesn’t wait for the child process to terminate (on Linux). Don’t ask me what close_fds does; I wrote the code some years ago. (BTW: The documentation of subprocess.Popen is confusing, IMHO.)
proc = Popen([cmd_str], shell=True,
stdin=None, stdout=None, stderr=None, close_fds=True)
Edit:
I looked at the the documentation of subprocess, and I believe the important aspect for you is stdin=None, stdout=None, stderr=None,. Otherwise Popen captures the program’s output, and you are expected to look at it. close_fds makes the parent process’ file handles inaccessible for the child.
Method 2
I finally got this to work. I’m running “Python 2.6.6 (r266:84297, Aug 24 2010, 18:13:38) [MSC v.1500 64 bit (AMD64)] win32”. Here’s how I had to code it:
from subprocess import Popen
DETACHED_PROCESS = 0x00000008
cmd = [
sys.executable,
'c:somepathsomeprogram.exe',
parm1,
parm2,
parm3,
]
p = Popen(
cmd, shell=False, stdin=None, stdout=None, stderr=None,
close_fds=True, creationflags=DETACHED_PROCESS,
)
This turns off all piping of standard input/output and does NOT execute the called program in the shell. Setting ‘creationflags’ to DETACHED_PROCESS seemed to do the trick for me. I forget where I found out about it, but an example is used here.
Method 3
I think the simplest way to implement this is using the os.spawn* family of functions passing the P_NOWAIT flag.
This for example will spawn a cp process to copy a large file to a new directory and not bother to wait for it.
import os os.spawnlp(os.P_NOWAIT, 'cp', 'cp', '/path/large-file.db', '/path/dest')
Method 4
You are capturing input and output to the program so your program will not terminate as long as it keeps those file descriptors open. If you want to capture, you need to close the file descriptors. If you don’t want to capture:
app = "C:WindowsNotepad.exe" file = "C:PathToFile.txt" pid = subprocess.Popen([app, file]).pid
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0