2

I have this but the subprocess reading from pipe at the end hangs:

$cat waitforinput.sh
#!/bin/sh


while read line
do
echo $line
done                    


>>> p1 = subprocess.Popen(["/home/abc/waitforinput.sh", "-v"], shell=True, executable=None,stdin=subprocess.PIPE, stdout=subprocess.PIPE)
>>> 
>>> 
>>> p1.stdin.write('This is a good idea\n')
>>> p1.stdin.write('This is a good idea\n')
>>> p1.stdin.write('This is a good idea\n')
>>> p1.stdin.write('This is a good idea\n')
>>> p1.stdin.write('This is a good idea\n')
>>> 
>>> 
>>> p1.stdin.flush()
>>> 
>>> for i in p1.stdout:
...     print i 
... 

What should I do so that it does not hang?

4

2 回答 2

3

代替 flush(),调用p1.stdin.close().

...
p1.stdin.write('This is good idea\n')
p1.stdin.write('This is good idea\n')

p1.stdin.close()

for i in p1.stdout:
    print i

更新

stdout-iterationstdout.readline()替换while-loop

请参阅 python 手册页-u部分:

强制标准输入、标准输出和标准错误完全无缓冲。在重要的系统上,还将标准输入、标准输出和标准错误置于二进制模式。请注意,xreadlines()、readlines() 和文件对象迭代器(“for line in sys.stdin”)中有内部缓冲,不受此选项影响。要解决此问题,您需要在“while 1:”循环中使用“sys.stdin.readline()”。

p1.stdin.flush()

while True:
    line = p1.stdout.readline()
    if not line:
        break
    print line

您将获得输出,但没有close(),脚本将不会结束。无论如何,您应该使用close().

于 2013-08-09T18:23:38.767 回答
1

问题是 waitforinput.sh 正在缓冲它的输出。falsetru 的解决方案有效,因为关闭会导致脚本退出并刷新其输出缓冲区。这是处理流水线命令的正常方式。

如果您希望以交互方式输出,您可以使用 pty 模块或 pexpect 来欺骗脚本,使其认为它正在写入终端。然后,它的输出将只被行缓冲。

于 2013-08-09T18:32:03.030 回答