运行进程并不等待
我想要启动一个程序,但不想等它完成后再继续。 我试过用spawn和P_NOWAIT,还有用subprocess,像这样:
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
不过,控制台窗口一直开着,直到我手动关闭记事本。请问有没有办法启动这个程序而不等它完成呢?
4 个回答
5
我觉得实现这个功能最简单的方法是使用 os.spawn* 这一系列的函数,并且传入 P_NOWAIT
这个标志。
比如说,这样做可以启动一个 cp
进程,用来把一个大文件复制到一个新目录,而不需要等这个过程完成。
import os
os.spawnlp(os.P_NOWAIT, 'cp', 'cp', '/path/large-file.db', '/path/dest')
32
我终于让这个程序运行起来了。我使用的是“Python 2.6.6 (r266:84297, 2010年8月24日, 18:13:38) [MSC v.1500 64位 (AMD64)] win32”。下面是我写的代码:
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,
)
这段代码关闭了所有标准输入和输出的管道,并且不会在命令行中执行被调用的程序。把'creationflags'设置为DETACHED_PROCESS对我来说似乎有效。我忘了在哪里看到这个信息了,但这里有一个例子 在这里。
79
这个调用在Linux上不会等待子进程结束。别问我close_fds
是干嘛的;我几年前写的代码。顺便说一句,我觉得subprocess.Popen
的文档有点让人困惑。
proc = Popen([cmd_str], shell=True,
stdin=None, stdout=None, stderr=None, close_fds=True)
编辑:
我看了一下subprocess的文档,我认为对你来说重要的是stdin=None, stdout=None, stderr=None,
。否则Popen会捕获程序的输出,你需要去查看这些输出。close_fds
则是让父进程的文件句柄对子进程不可用。