运行进程,不要等待

时间:2010-08-18 19:41:55

标签: python windows

我想运行一个进程,而不是等待它返回。我已尝试使用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 个答案:

答案 0 :(得分:45)

此调用不会等待子进程终止(在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使父进程'文件句柄对子进程无法访问。

答案 1 :(得分:19)

我终于开始工作了。我正在运行“Python 2.6.6(r266:84297,2010年8月24日,18:13:38)[MSC v.1500 64 bit(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似乎对我有用。我忘了我发现它的地方,但是使用了一个例子here

答案 2 :(得分:1)

我认为实现这一点的简单方法是使用传递@Component({ selector: // My selector templateUrl: // My template URL }) export class AlarmComponent { @Input() alarm; @ViewChild(MdMenuTrigger) trigger: MdMenuTrigger; // ... private onContextMenu($event: Event, alarm: Alarm): void { this.trigger.openMenu(); $event.preventDefault(); } 标志的os.spawn*系列函数。

例如,这将生成一个P_NOWAIT进程,将大文件复制到一个新目录,而不必费心等待它。

cp

答案 3 :(得分:0)

您正在捕获程序的输入和输出,因此只要打开这些文件描述符,您的程序就不会终止。如果要捕获,则需要关闭文件描述符。如果您不想捕获:

app = "C:\Windows\Notepad.exe"
file = "C:\Path\To\File.txt"

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