Python: subprocess.Popen и subprocess.call зависают
У меня проблема с использованием subprocess.Popen или subprocess.call, когда я использую их для выполнения команд, которые генерируют много выходных данных, скрипты python зависают, но что странно, что после ожидания некоторое время, script находится в зависающем состоянии, я обнаружил, что задание, заданное линией cmd, выполнено, и вызывается только script.
subprocess.call(cmd, shell = True)
#OR
subprocess.Popen(cmd, stdout = subprocess.PIPE, stdin = subprocess.PIPE, shell = True)
# HANGS HERE
print "show something after subprocess"
Обратите внимание, что последняя печать никогда не выполняется, но на самом деле выполняется cmd.
Обратите внимание, что cmd связан с последовательным портом, поэтому, когда я подключаю последовательный кабель, все становится хорошо, и последний statetement печати выполняется. Но когда я использую терминал, все нормально, даже если последовательный порт подключен, это происходит только с python script.
Спасибо большое
Ответы
Ответ 1
Согласно документации python, subprocess.call
запускает команду и ждет ее завершения, поэтому она эквивалентна subprocess.Popen
, за которой следует Popen.wait
.
Однако документация метода Popen.wait
явно предупреждает о проблеме переполнения буфера и рекомендует вместо этого использовать Popen.communicate
. Следовательно, решение, которое вы ищете, должно быть примерно таким:
import subprocess
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
stdout, stderr = process.communicate()
print "show something after subprocess"
Ответ 2
Я не понимаю, почему ваша первая строка не работает - поскольку нет перенаправления stdin
/stdout
/stderr
, блокировки не нужно.
Второй должен блокироваться, если процесс
- ожидает данные через stdin или
- отправляет больше данных в stdout, чем может храниться в трубе, если вы не читаете.
Но поскольку ваш подпроцесс завершается правильно, я не вижу причины для блокировки. Вы уверены, что это действительно заканчивается?