Bullines
Bullines

Reputation: 5696

Run Process and Don't Wait

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:\Windows\Notepad.exe"
file = "C:\Path\To\File.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?

Upvotes: 64

Views: 122961

Answers (4)

Bruno Oliveira
Bruno Oliveira

Reputation: 15245

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')

Upvotes: 5

Jon Winn
Jon Winn

Reputation: 321

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:\somepath\someprogram.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.

Upvotes: 32

idbrii
idbrii

Reputation: 11916

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:\Windows\Notepad.exe"
file = "C:\Path\To\File.txt"

pid = subprocess.Popen([app, file]).pid

Upvotes: 1

Eike
Eike

Reputation: 2213

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.

Upvotes: 80

Related Questions