即使当前的孩子已经终止,Popen也在等待孩子的进程

我正在使用Windows 8 / 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已经离开了。 有什么想法和可能的解决scheme可能是什么?

不幸的是,将A改为B的明显解决scheme不是一种select。

下面是一个函数示例代码来说明这个问题: https : //www.dropbox.com/s/cbplwjpmydogvu2/popen.zip?dl=1

任何input是非常感激。

您可以为Cstart_new_session提供start_new_session模拟:

 #!/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]: CreateProcess()的进程创build标志

这是一个从塞巴斯蒂安的答案和这个答案改编的代码片段:

 #!/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, close_fds=True) 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() 

我只在Windows上testing过它。