我遇到了使用这个解析生成的输出的Python脚本的死锁问题 管道两个程序并将结果存储在目录x。
中import subprocess as sp
from time import sleep
p1 = sp.Popen(['executable_1'], stdout=sp.PIPE , stderr = sp.STDOUT)
p2 = sp.Popen(['executable_2'], stdin=p1.stdout, stdout = sp.PIPE)
x = my_parser(p2.stdout)
但是,如果我使用p2 = sp.Popen(executable_2, stdin=p1.stdout, stdout = sp.PIPE, preexec_fn = time.sleep(0.1))
更改脚本,一切似乎都正常。
虽然解决方案对我来说似乎不太干净。我知道等待一段时间我可以让p1将其输出刷新到stdout,(尽管如果我手动尝试p1.stdout.flush()
我有时也会得到IOError。)
我不能使用communic(),因为p2的输出非常大,我想在executable_2
仍在执行时处理数据。
如何在不使用sleep()的情况下防止死锁?