1

我有两个简单的程序:

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

4

2 回答 2

4

Popen 不会向任何输出发送垃圾邮件,当您的 Python 程序退出时 test.sh 将收到一个 EOF(文件结尾),指示没有任何内容可读取,此时readtest.sh 中的命令将给出一个空字符串 on每次调用并给出退出状态代码 1。

在永远不会发生的输入上设置 test.sh 块实际上没有任何意义,read如果遇到 EOF 或其他读取错误,最好检查并退出的状态代码:

rm ~/out.txt
for ((i=0; i<10; i++)); do
  read j
  if [ $? != 0 ]; then
    break
  fi
  echo "read: '$j'" >> ~/out.txt
done
于 2013-06-07T17:34:24.893 回答
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()
于 2013-06-07T17:32:25.493 回答