Получение вывода процесса во время выполнения
Я использую скрипт python для запуска процесса с помощью subprocess.Popen
и одновременно сохраняю вывод в текстовом файле, а также распечатываю его на консоли. Это мой код:
result = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) for line in result.stdout.readlines(): #read and store result in log file openfile.write("%s\n" %line) print("%s" %line)
Над кодом работает отлично, но то, что он делает, это сначала завершает процесс и сохраняет результат в переменной результата . После этого для цикла сохраняется выход, а также его печать.
Но я хочу выход во время выполнения (так как мой процесс может занять несколько часов, я не получаю никакого вывода за все эти часы).
Итак, есть ли какая-либо другая функция, которая дает мне результат динамически (во время выполнения), означает, что как только процесс выдаст первую строку, он должен быть напечатан.
- Вход пользователя в вызов подпроцесса?
- подождать до тех пор, пока все подпроцессы не закончатся?
- Python: чтение подпроцесса 'stdout без печати в файл
- Запуск внешней программы с заданным максимальным временем работы
- Как получить полезный результат из подпроцесса?
Проблема здесь в том, что .readlines()
получает весь вывод перед возвратом, поскольку он создает полный список. Просто повторите прямо:
for line in result.stdout: print line
.readlines()
возвращает список всех строк, которые процесс будет возвращать при открытии, т. е. он ничего не возвращает, пока не будет получен весь вывод из подпроцесса. Чтобы читать строки за строкой в «реальном времени»:
import sys from subprocess import Popen, PIPE proc = Popen(cmd, shell=True, bufsize=1, stdout=PIPE) for line in proc.stdout: openfile.write(line) sys.stdout.buffer.write(line) sys.stdout.buffer.flush() proc.stdout.close() proc.wait()
Примечание: если подпроцесс использует блочную буферизацию, когда он выполняется в неинтерактивном режиме; вам понадобятся pexpect
, pty
или stdbuf
, stdbuf
, script
.
Примечание: на Python 2 вам также может понадобиться использовать iter()
, чтобы получить вывод «реального времени»:
for line in iter(proc.stdout.readline, ""): openfile.write(line) print line,
Вы можете перебирать строки по одному с помощью readline
на трубе:
while True: line = result.stdout.readline() print line.strip() if not line: break
Строки содержат трейлинг \n
которые я удалял для печати. Когда процесс завершается, readline возвращает пустую строку, поэтому вы знаете, когда остановиться.
- Как установить scikit-learn на геройку кедра?
- Матричные вычисления на эквидистантных элементах без петель
- читать stdout и stderr из подпроцесса по строкам simulanously без одного select () на строку
- Невозможно убить запущенный подпроцесс с помощью Python в Windows
- Как я могу сказать, что подпроцесс перестает сбрасывать мои кавычки?
- дождитесь окончания другого скрипта python
- Выполнение подпроцесса в фоновом режиме
- mailx не работает с подпроцессом
- Подождите, пока внешняя программа завершит запись в файл.
- Повреждение оболочки после убийства подпроцесса
- используя подпроцесс Python для перенаправления stdout на stdin?