运行进程并不等待

61 投票
4 回答
116487 浏览
提问于 2025-04-16 02:59

我想要启动一个程序,但不想等它完成后再继续。 我试过用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则是让父进程的文件句柄对子进程不可用。

撰写回答