gpt4 book ai didi

python - 更好地多线程使用 Python subprocess.Popen & communicate()?

转载 作者:行者123 更新时间:2023-11-28 17:53:54 24 4
gpt4 key购买 nike

我在运行 Python 2.6 的 Linux 机器上并行运行可能需要一些时间的多个命令。

因此,我使用subprocess.Popen类和process.communicate()方法来并行执行多个命令组,并在执行后立即捕获输出。

def run_commands(commands, print_lock):
# this part runs in parallel.
outputs = []
for command in commands:
proc = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
output, unused_err = proc.communicate() # buffers the output
retcode = proc.poll() # ensures subprocess termination
outputs.append(output)
with print_lock: # print them at once (synchronized)
for output in outputs:
for line in output.splitlines():
print(line)

在其他地方它是这样称呼的:

processes = []
print_lock = Lock()
for ...:
commands = ... # a group of commands is generated, which takes some time.
processes.append(Thread(target=run_commands, args=(commands, print_lock)))
processes[-1].start()
for p in processes: p.join()
print('done.')

预期的结果是同时显示一组命令的每个输出,同时并行执行它们。

但是从第二个输出组开始(当然,由于调度不确定性而改变了成为第二个的线程),它开始打印没有换行符并添加与前一行和输入中打印的字符数一样多的空格echo 已关闭——终端状态为“乱码”或“崩溃”。 (如果我发出 reset shell 命令,它会恢复正常。)

起初,我试图从'\r'的处理中寻找原因,但不是原因。正如您在我的代码中看到的,我使用 splitlines() 正确处理了它,并且我使用应用于输出的 repr() 函数确认了这一点。

我认为原因是在 Popencommunicate() 中为 stdout/stderr 同时使用了管道。我在 Python 2.7 中尝试了 check_output 快捷方式,但没有成功。当然,如果我将所有的命令执行和打印序列化,就不会出现上述问题。

是否有更好的方法来并行处理 Popencommunicate()

最佳答案

最终结果的灵感来自 J.F.Sebastian 的评论。

http://bitbucket.org/daybreaker/kaist-cs443/src/247f9ecf3cee/tools/manage.py

这似乎是一个 Python 错误。

关于python - 更好地多线程使用 Python subprocess.Popen & communicate()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4287178/

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