Python Popen stdin PIPE得到了发芽

时间:2013-06-07 17:25:23

标签: python stdin popen

我有两个简单的程序:

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()没有任何好处。我该如何防止这种情况?

2 个答案:

答案 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()