当前位置: 首页 > 面试题库 >

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

南门焱
2023-03-14
问题内容

我正在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

非常感谢任何输入。


问题答案:

您可以为子流程提供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.html" target="_blank">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()的进程创建标志



 类似资料:
  • 如果你想等待 process::Child 完成,就必须调用 Child::wait,这会返回一个 process::ExitStatus。 use std::process::Command; fn main() { let mut child = Command::new("sleep").arg("5").spawn().unwrap(); let _result = chi

  • 我希望能够在后台启动一大批工作,而不使用bash脚本,并继续在同一个内核上工作。这有可能吗?我对架构变化持开放态度,但我的库的最终用户可能不是很复杂。 表示ipython单元 python 3.7。6从JupyterLab内部

  • 问题内容: 我正在尝试使用PyQt为名为“ HandBrake”的视频转换器应用程序构建一个简单的GUI。 我的问题是,当我选择要转换的视频文件时,子进程Popen使用必需的args启动手刹应用程序,但是在等待手刹完成gui时会被阻止,因此我无法进行任何更改。(例如:我不能禁用按钮,也不能更改其文本) 我不是在寻找更复杂的解决方案,例如progressbar等,但是我想在等待程序完成转换的同时简单

  • 问题内容: 我对使用时如何搜索可执行文件感到困惑。如果给子进程提供了绝对路径,那么它就可以工作,但是我正在尝试使用相对路径。我发现,如果设置环境变量PYTHONPATH,则可以从该路径中获取导入的模块,并且PYTHONPATH在其中,但似乎对的行为没有帮助。我也尝试编辑将PYTHONPATH添加到的文件,就像这样 并验证了在以交互方式,与ipython或通过从命令行运行脚本启动python时,PY

  • 问题内容: 对于子进程,和函数可用于暂停当前进程的执行,直到子进程退出。但是此功能不能用于非子进程。 是否有另一个函数可以等待任何进程的退出? 问题答案: 什么都不等于。通常的做法是使用轮询,寻找返回值-1和的,表明进程已经一去不复返了。

  • 我试图使用popen启动一个子进程,该子进程一个接一个地调用两个命令(带有多个参数)。第二个命令依赖于第一个命令的运行,因此我希望使用一个子进程同时运行这两个命令,而不是生成两个进程并等待第一个。 但是我遇到了一些问题,因为我不知道如何给出两个命令输入,或者如何将命令作为一个对象分开。 另外,如果可能的话,我会尽量避免将shell设置为true。 这基本上就是我要做的: