Popen waiting for child process even when the immediate child has terminated(即使直接子进程已终止,Popen 也会等待子进程)
问题描述
我在 Windows 8/XP 上使用 Python 2.7.
I'm working with Python 2.7 on Windows 8/XP.
我有一个程序 A 使用以下代码运行另一个程序 B:
I have a program A that runs another program B using the following code:
p = Popen(["B"], stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate()
return
B 运行批处理脚本 C.C 是一个长时间运行的脚本,即使 C 尚未完成,我也希望 B 退出.我已经使用以下代码(在 B 中)完成了它:
B runs a batch script C. C is a long running script and I want B to exit even though C has not finished. I have done it using the following code (in B):
p = Popen(["C"])
return
当我运行 B 时,它按预期工作.但是,当我运行 A 时,我希望它在 B 退出时退出.但是即使 B 已经退出,A 也会等到 C 退出.关于正在发生的事情以及可能的解决方案有什么想法吗?
When I run B, it works as expected. When I run A however, I expected it to exit when B exits. But A waits until C exits even though B has already exitted. Any ideas on what's happening and what possible solutions could be?
不幸的是,将 A 更改为 B 的明显解决方案是不可行的.
Unfortunately, the obvious solution of changing A to look like B is not an option.
以下是说明此问题的功能示例代码:https://www.dropbox.com/s/cbplwjpmydogvu2/popen.zip?dl=1
Here is a functional sample code to illustrate this issue: https://www.dropbox.com/s/cbplwjpmydogvu2/popen.zip?dl=1
非常感谢任何意见.
推荐答案
您可以为 C 子进程提供 start_new_session 模拟:
You could provide start_new_session analog for the C subprocess:
#!/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 的进程创建标志()
这篇关于即使直接子进程已终止,Popen 也会等待子进程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:即使直接子进程已终止,Popen 也会等待子进程
基础教程推荐
- 在Python中从Azure BLOB存储中读取文件 2022-01-01
- 使用大型矩阵时禁止 Pycharm 输出中的自动换行符 2022-01-01
- Plotly:如何设置绘图图形的样式,使其不显示缺失日期的间隙? 2022-01-01
- 求两个直方图的卷积 2022-01-01
- 包装空间模型 2022-01-01
- PANDA VALUE_COUNTS包含GROUP BY之前的所有值 2022-01-01
- 在同一图形上绘制Bokeh的烛台和音量条 2022-01-01
- 修改列表中的数据帧不起作用 2022-01-01
- 无法导入 Pytorch [WinError 126] 找不到指定的模块 2022-01-01
- PermissionError: pip 从 8.1.1 升级到 8.1.2 2022-01-01
