Popen等待子进程,即使直接子进程已终止

发布于 2021-01-29 14:10:33

我正在Windows 8 / XP上使用Python 2.7。

我有一个程序A,它使用以下代码运行另一个程序B:

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

B运行批处理脚本C。C是运行时间较长的脚本,即使C尚未完成,我也希望B退出。我已经使用以下代码(在B中)完成了此操作:

p = Popen(["C"])
return

当我运行B时,它可以按预期工作。但是,当我运行A时,我希望它在B退出时退出。但是,即使B已经退出,A也会等到C退出。关于正在发生的事情以及可能的解决方案的任何想法?

不幸的是,将A更改为B的明显解决方案不是一种选择。

这是一个功能性的示例代码来说明此问题:https
:
//www.dropbox.com/s/cbplwjpmydogvu2/popen.zip?dl=1

非常感谢任何输入。

关注者
0
被浏览
111
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以为子流程提供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]:CreateProcess()的进程创建标志



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看