我想运行一个进程,而不是等待它返回。 我已经尝试与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
但是,控制台窗口仍然保留,直到我closures记事本。 是否有可能启动该stream程,而不是等待它完成?
这个调用不等待子进程终止(在Linux上)。 不要问我什么close_fds
; 我几年前就写了这个代码。 (顺便说一下: subprocess.Popen
进程的文档subprocess.Popen
令人困惑,恕我直言。)
proc = Popen([cmd_str], shell=True, stdin=None, stdout=None, stderr=None, close_fds=True)
编辑:
我看了子进程的文档,我相信对你来说重要的是stdin=None, stdout=None, stderr=None,
。 否则, Popen会捕获程序的输出结果,你需要看看它。 close_fds
使得父进程的文件句柄对于孩子是不可访问的。
我终于得到这个工作。 我正在运行“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)
这将关闭标准输入/输出的所有管道,并且不执行shell中的调用程序。 将'creationflags'设置为DETACHED_PROCESS似乎对我有用。 我忘记了我在哪里发现的,但在这里使用了一个例子。
我认为实现这个简单的方法是使用传递P_NOWAIT
标志的os.spawn *系列函数。
这个例子会产生一个cp
进程来把大文件复制到一个新的目录,而不用等待它。
import os os.spawnlp(os.P_NOWAIT, 'cp', 'cp', '/path/large-file.db', '/path/dest')