Подтвердить что ты не робот

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.

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

4b9b3361

Ответ 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, чем может храниться в трубе, если вы не читаете.

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