Python: subprocess.Popen и subprocess.call зависают - PullRequest
16 голосов
/ 10 ноября 2011

У меня проблема с использованием subprocess.Popen или subprocess.call, когда я использую их для выполнения командных строк, которые генерируют много выходных данных, скрипты python зависают, но что странно, если после ожидания некоторое время, в то время как скрипт находится в подвешенном состоянии, я обнаружил, что задание, заданное строкой cmd, выполнено, и вывешен только скрипт.

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 связан с последовательным портом, поэтому, когда я подключаю последовательный кабель, все становится хорошо, и выполняется последнее заявление о печати. Но когда я использую терминал, все в порядке, даже если последовательный порт подключен, это происходит только со скриптом Python.

Большое спасибо

Ответы [ 2 ]

13 голосов
/ 10 ноября 2011

Согласно документации на 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 голосов
/ 10 ноября 2011

Я не понимаю, почему ваша первая строка не работает - так как нет перенаправлений stdin / stdout / stderr, блокировка не требуется.

Второй должен блокироваться, если процесс

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

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

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