我有两个简单的程序:
test.sh
rm ~/out.txt
for ((i=0; i<10; i++)); do
read j
echo "read: '$j'" >> ~/out.txt
done
并且test.py
import sub
process
proc = subprocess.Popen('/Users/plg/test.sh', stdin=subprocess.PIPE)
proc.stdin.write('1\n')
proc.stdin.write('2\n')
当我运行test.py(使用Python 2.7.2)时,〜/ out.txt包含:
read: '1'
read: '2'
read: ''
read: ''
read: ''
...
为什么test.sh会收到最后8行?它应该卡住并等待输入。 但显然,一旦我写了一些内容并且Python退出,Popen就会发送'\ n'。
我无法找到解决方法,使用proc.stdin.flush()和proc.stdin.close()没有任何好处。我该如何防止这种情况?
答案 0 :(得分:4)
当你的Python程序退出test.sh时,Popen不会向任何输出发送垃圾邮件,它会收到一个EOF(文件结束),表示没有任何内容可供阅读,此时read
命令在测试中.sh将在每次调用时给出一个空字符串,并提供退出状态代码为1。
在输入上输入一个永远不会发生的test.sh块是没有意义的,如果遇到EOF或其他读取错误,最好检查read
的状态代码并退出:
rm ~/out.txt
for ((i=0; i<10; i++)); do
read j
if [ $? != 0 ]; then
break
fi
echo "read: '$j'" >> ~/out.txt
done
答案 1 :(得分:0)
import subprocess
proc = subprocess.Popen('/Users/plg/test.sh', stdin=subprocess.PIPE)
proc.stdin.write('1\n')
proc.stdin.write('2\n')
proc.wait()