Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 在不使用睡眠的情况下使用Popen避免死锁(Python 2.7)_Python 2.7_Subprocess_Deadlock - Fatal编程技术网

Python 2.7 在不使用睡眠的情况下使用Popen避免死锁(Python 2.7)

Python 2.7 在不使用睡眠的情况下使用Popen避免死锁(Python 2.7),python-2.7,subprocess,deadlock,Python 2.7,Subprocess,Deadlock,我在使用这个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(p

我在使用这个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将其输出刷新到标准输出(尽管如果我手动尝试
p1.stdout.flush()
I有时也会出现IOError)

我不能使用communicate(),因为p2的输出非常大,我想在
可执行文件\u 2
仍在执行时处理数据


在这种情况下,如果不使用sleep(),如何防止死锁?

这毫无意义。在调用popen并将None传递给preexec_fn时,您正在执行睡眠。如果你想让它在叉子后睡觉,你难道不想通过一个部分或lambda睡觉吗?你所做的是在你的popen运行之前有效地呼叫睡眠。你是对的jdi。事实上,经过长时间痛苦的调试后,我发现这是由一个错误引起的,该错误仅在打印大输出时出现在带有QT4Agg后端的ipython中(这是由myparser完成的,它在开发过程中打印了命令的输出)。请参见我报告错误的地方:)