gpt4 book ai didi

python - Popen.communicate 被卡住,直到子进程产生的进程终止

转载 作者:行者123 更新时间:2023-11-28 22:15:26 29 4
gpt4 key购买 nike

我有以下三个脚本,当我运行 main.py 文件时,它会生成 child.py,它再次执行 subchild.py 并迅速终止,但是 subchild.py 会继续执行很长时间。

问题在于,main.py 在 p.communicate() 处被阻塞,直到 subchild.py 终止。如果我打开任务管理器并终止正在运行的 subchild.py main.py 立即返回 child.py 的输出

所以我的问题如下

  • main.py 应该只等到 child.py 终止,为什么它要等待 subchild.py 终止?
  • 如何让 p.communicate() 不等到 subchild.py 完成执行?
    # main.py file

if __name__ == '__main__':
import subprocess
p = subprocess.Popen(
["python", "child.py"],
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
stderr=subprocess.PIPE
)
out, _ = p.communicate()
print(out)


# child.py file

if __name__ == '__main__':
import subprocess
print("Child running")
p = subprocess.Popen(["python", "subchild.py"])
print("Child pid - ", p.pid)
exit(1)


# subchild.py file

if __name__ == '__main__':
import time
time.sleep(10000)

注意:我正在 Windows 7 Enterprise 上尝试此操作。我用的是python3.6.6

评论后更新:在 main.py 上,我需要 child.py 的 pid、stdout、stderr 和进程对象,以便我可以在以后的任何时候从 main.py 中杀死 child.py。这段代码是一小段代码,是我正在构建的一些 API 的一部分,如果他愿意,用户希望控件终止进程。 subprocesses.call 或 subprocesses.run 不会让我控制 process 对象。我也无法控制我将收到什么 child.py 命令作为 main.py 的输入,所以我需要以某种方式不等待 subchild.py 并在 child.py 完成后立即退出。

最佳答案

您的communicate 调用不只是等待 child 完成。它首先尝试读取 child 的标准输出和标准错误的全部内容。

即使 child 读完了, parent 也无法停止阅读,因为孙子继承了 child 的标准输入、标准输出和标准错误。 parent 需要等待孙子完成,或者至少等待孙子关闭其标准输出和标准错误,然后 parent 才能确定它已完成读取。

关于python - Popen.communicate 被卡住,直到子进程产生的进程终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52882620/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com