Run Process and Don't Wait

Question:

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?

Asked By: Bullines

||

Answers:

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.

Answered By: Eike

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.

Answered By: Jon Winn

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')
Answered By: Bruno Oliveira

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
Answered By: idbrii
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.