gpt4 book ai didi

python - 了解 Popen.communicate

转载 作者:IT老高 更新时间:2023-10-28 20:25:45 34 4
gpt4 key购买 nike

我有一个名为 1st.py 的脚本,它创建了一个 REPL(read-eval-print-loop):

print "Something to print"
while True:
r = raw_input()
if r == 'n':
print "exiting"
break
else:
print "continuing"

然后我使用以下代码启动了 1st.py:

p = subprocess.Popen(["python","1st.py"], stdin=PIPE, stdout=PIPE)

然后尝试了这个:

print p.communicate()[0]

它失败了,提供了这个回溯:

Traceback (most recent call last):
File "1st.py", line 3, in <module>
r = raw_input()
EOFError: EOF when reading a line

你能解释一下这里发生了什么吗?当我使用 p.stdout.read() 时,它会永远挂起。

最佳答案

.communicate() 写入输入(在这种情况下没有输入,所以它只是关闭子进程的标准输入以向子进程指示没有更多输入),读取所有输出,然后等待子进程退出。

raw_input() 在子进程中引发异常 EOFError(它需要数据但得到 EOF(无数据))。

p.stdout.read() 永远挂起,因为它试图在 child 等待输入( raw_input()) 导致死锁。

为避免死锁,您需要异步读/写(例如,通过使用线程或选择)或确切知道何时以及读/写多少,for example :

from subprocess import PIPE, Popen

p = Popen(["python", "-u", "1st.py"], stdin=PIPE, stdout=PIPE, bufsize=1)
print p.stdout.readline(), # read the first line
for i in range(10): # repeat several times to show that it works
print >>p.stdin, i # write input
p.stdin.flush() # not necessary in this case
print p.stdout.readline(), # read output

print p.communicate("n\n")[0], # signal the child to exit,
# read the rest of the output,
# wait for the child to exit

注意:如果读/写不同步,这是一个非常脆弱的代码;它死锁了。

小心block-buffering issue (这里使用 "-u" flag that turns off buffering for stdin, stdout in the child 解决)。

bufsize=1 makes the pipes line-buffered on the parent side .

关于python - 了解 Popen.communicate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16768290/

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