Получение небуферизованного вывода из подпроцесса не работает Python
У меня есть основания полагать, что если я запустил его с флагами, он запускает инструмент, который генерирует сообщения все время. Когда я пытаюсь запустить его с подпроцессом, я получаю вывод в cmd, и это нормально. Дело в том, что я хочу взять эти сообщения и что-то с ними сделать, но по какой-то причине метод небуфринга не работает, и я не получаю никаких сообщений.
Ниже приведен код, который я попробовал:
p = subprocess.Popen(
["my_tool.exe","runMode","y","port","1234"],stdout=subprocess.PIPE,stderr=subprocess.STDOUT, bufsize=1)
Для генерации вывода попробовал следующее:
for line in p.stdout:
print("CUR", line)
а также:
while p.poll() is None:
line = p.stdout.read(2)
print("Print:" + line)
а также:
for line in iter(p.stdout.readline, b''):
print(line)
p.stdout.close()
Есть идеи, почему кодовые блоки всегда в строке stdout?
ОБНОВИТЬ:
Например, если у меня есть следующая бесконечная программа:
inf.py
import time
i = 0
while True:
time.sleep(0.5)
print(i)
i += 1
и следующий код, который запускает его:
p = subprocess.Popen(r"C:\Python35\python.exe inf.py",
stdout=subprocess.PIPE, bufsize=1, universal_newlines=True)
и для генерации вывода я использую один из вышеперечисленных методов. Если я остановлю его с помощью CTRL+ C, он всегда застрянет в этой строке:
File "C:\Python35\lib\encodings\cp1252.py", line 22, in decode
def decode(self, input, final=False):
0 ответов
Сначала я установил следующую переменную окружения:PYTHONUNBUFFERED=1
Затем я немного изменил ваш код:
read_infinite.py
import subprocess
binary = "C:\\Python35\\python.exe"
script = "C:\\temp\\python\\tests\\inf.py"
p = subprocess.Popen([binary, script], stdout=subprocess.PIPE, bufsize=1, universal_newlines=True)
while p.poll() is None:
#line = p.stdout.read(2)
line = p.stdout.readline()
if line:
print("Result: %r" % line)
Удаление bufsize=1
работает так же.
Сначала я получил ошибку, что inf.py не был найден, но это не было показано, потому что распечатки read_infinite.py прокручивали ошибку. И процесс остановился после большого количества строк "Result:" (переменная "строка" пуста).
Удаление if line:
и добавление time.sleep(0.5)
после печати (помните import time
!) показывает те же результаты.
Итак, решение таково: родитель должен ждать ребенка.