1

私は2つの簡単なプログラムを持っています:

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() を使用しても何の効果もありません。これを防ぐにはどうすればよいですか?

4

2 に答える 2

4

Python プログラムが終了すると、Popen は出力をスパムしません。test.sh は、読み取るものが残っていないことを示す EOF (ファイルの終わり) を受け取ります。その時点でread、test.sh のコマンドは空の文字列を返します。各呼び出しで終了ステータス コード 1 を返します。

入力時に test.sh がブロックされることはまったく意味がありません。EOFreadまたはその他の読み取りエラーが発生した場合は、ステータス コードをチェックインして終了することをお勧めします。

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 に答える