2013-06-07 5 views
1

У меня есть два простых программ:Python Popen STDIN PIPE получает spamed

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 содержит:

Wh y делает test.sh получать последние 8 строк? Он должен застрять и ждать ввода. Но, по-видимому, Popen spams «\ n» однажды написал что-то, и Python выйдет.

Я не могу найти исправление для этого, используя proc.stdin.flush() и proc.stdin.close() не приносит пользы. Как я могу это предотвратить?

ответ

4

Popen не спамить любой выход, когда ваша программа выходит на Python test.sh получит в EOF (конец файла), указывающий, что не осталось ничего читать, после чего команды read в тесте .sh даст пустую строку для каждого вызова и выдаст код состояния выхода из 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 
+0

О, теперь я понимаю! Это как чтение из пустого файла. Благодаря! – ThinkChaos

+0

Спасибо за редактирование с помощью нового кода, но я в ситуации, когда я взаимодействую с внешней программой (приложение java), и я не могу просто изменить исходный текст для работы, как будто мне это нужно, Я должен адаптироваться. – ThinkChaos

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() 
+0

Спасибо, я использовал это (в примере, чтению понадобится тайм-аут, или Python будет ждать навсегда). – ThinkChaos

Смежные вопросы