Вызов subprocess.call зависает, когда я устанавливаю стандартный вывод - PullRequest
1 голос
/ 20 марта 2012

У меня есть функция, которую я называю progarm, с некоторыми аргументами и хочу получить результат.

Когда я использую следующее

proc = subprocess.call(["fetch.py", "--cookies=/tmp/tmp-cookies"], stdout=PIPE, stderr=PIPE)
stdout, stderr = proc.communicate()
return stdout

Приложение просто зависает. Но если я бегу

return subprocess.call(["fetch.py", "--cookies=/tmp/tmp-cookies"])

затем я получаю вывод на экран, и приложение работает нормально, однако мне нужно получить вывод в функцию.

Я использую Python 2.6.1 и не могу использовать check_output

Ответы [ 2 ]

5 голосов
/ 20 марта 2012

Как сказано в spec ,

Не используйте stdout = PIPE или stderr = PIPE с этой функцией.Поскольку каналы не читаются в текущем процессе, дочерний процесс может блокироваться, если он генерирует достаточно данных для канала, чтобы заполнить буфер канала ОС.

Вместо этого вам нужно набрать subprocess.Popen:

proc = subprocess.Popen(["fetch.py", "--cookies=/tmp/tmp-cookies"], 
                       stdout=PIPE, stderr=PIPE)
stdout, stderr = proc.communicate()
return stdout

(Кроме того, subprocess.call не возвращает объект процесса, только состояние выхода)

0 голосов
/ 20 марта 2012

Ваш подпроцесс должен прочитать свой стандартный ввод до завершения связи, и основной процесс может продолжиться.Обходной путь будет записан в потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...