【问题标题】:Non-blocking version of Popen.communicate() in Python Subprocess modulePython Subprocess 模块中 Popen.communicate() 的非阻塞版本
【发布时间】:2022-01-19 20:09:57
【问题描述】:

我正在尝试在 Python 程序中生成的两个 shell 中并行执行多个命令。我尝试使用 popen.communicate(),但是这种方法是阻塞的,并且不允许我同时运行它们。我目前有。

proc_1 = subprocess.Popen('adb shell', shell=True, stdin=subprocess.PIPE)
proc_2 = subprocess.Popen('adb shell', shell=True, stdin=subprocess.PIPE)
proc_1.communicate(b'second adb command')
proc_2.communicate(b'second adb command')

它目前正在等待第一个通信调用完成,然后再继续进行第二个。我怎样才能同时运行它们?

【问题讨论】:

  • Python 多处理模块将是一个合适的选择。
  • @Hamed_gibago,是否可以使用multiprocessing 运行非python 程序?
  • @azelcer 是的,您可以运行它并传递参数。看看这个页面,它指导你在 python 之外运行一个进程:“docs.python.org/3/library/…

标签: python subprocess


【解决方案1】:

这是communicateexpected behavior

stdoutstderr 读取数据,直到到达文件末尾。等待进程终止并设置returncode 属性。

由于您不需要管理stdoutstderr应该0 的超时时间调用communicate 并捕获TimeoutExpired 异常:

import subprocess

def communicate_nowait(proc, message):
    try:
        proc.communicate(message, 1E-3)  # 0 might have problems
    except subprocess.TimeoutExpired:
        pass
    
proc_1 = subprocess.Popen('adb shell', shell=True, stdin=subprocess.PIPE)
proc_2 = subprocess.Popen('adb shell', shell=True, stdin=subprocess.PIPE)
communicate_nowait(proc_1, b'second adb command')
communicate_nowait(proc_2, b'second adb command')

请注意,您必须妥善处理清理工作(请参阅 communicate 文档)。

警告: 似乎太小的超时可能会导致问题(请参阅reported bug)。

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 2013-01-26
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    相关资源
    最近更新 更多