我正在Windows8/XP上使用python 2.7。
我有一个程序A使用以下代码运行另一个程序B:

p = Popen(["B"], stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate()
return

B运行批处理脚本C。C是一个长时间运行的脚本,我希望B退出,即使C尚未完成。我用以下代码(在B中)完成了它:
p = Popen(["C"])
return

当我运行b时,它按预期工作。当我运行a时,我期望它在b退出时退出。但A会等到C退出,即使B已经退出。对发生的事情和可能的解决方案有什么想法吗?
不幸的是,将a改为b的明显解决方案不是一种选择。
下面是一个功能示例代码,用于说明此问题:
https://www.dropbox.com/s/cbplwjpmydogvu2/popen.zip?dl=1
任何意见都非常感谢。

最佳答案

您可以为start_new_session子进程提供C模拟:

#!/usr/bin/env python
import os
import sys
import platform
from subprocess import Popen, PIPE

# set system/version dependent "start_new_session" analogs
kwargs = {}
if platform.system() == 'Windows':
    # from msdn [1]
    CREATE_NEW_PROCESS_GROUP = 0x00000200  # note: could get it from subprocess
    DETACHED_PROCESS = 0x00000008          # 0x8 | 0x200 == 0x208
    kwargs.update(creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP)
elif sys.version_info < (3, 2):  # assume posix
    kwargs.update(preexec_fn=os.setsid)
else:  # Python 3.2+ and Unix
    kwargs.update(start_new_session=True)

p = Popen(["C"], stdin=PIPE, stdout=PIPE, stderr=PIPE, **kwargs)
assert not p.poll()

[1]:Process Creation Flags for CreateProcess()

关于python - 即使直系 child 已经终止,Popen仍在等待 child 的过程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13243807/

10-12 18:14