Запустите программу и войдите в экран и файл в режиме реального времени

529
Greedo

Я написал очень простую программу на Python (на самом деле моя программа намного сложнее):

from time import sleep for i in range(10): print(i) sleep(1) 

печатать цифры 0-9, 1 каждую секунду в течение 10 секунд. Я сохранил это какTestShell.py

Я могу запустить его в PowerShell, используя

python .\TestShell.py 

который выводит правильно, 1 цифра каждую секунду. Однако я также хотел бы сохранить вывод в файле журнала. Я ожидал использовать Tee-Objectдля этого

python .\TestShell.py | Tee-Object -FilePath .\fileLog.txt 

который принимает файл журнала как один параметр и неявно записывает в консоль без второго параметра. Однако теперь вывод не выводится, пока не будет запущена вся программа. То есть я ничего не вижу в течение 10 секунд, затем цифры 0-9 все сразу.

Есть ли способ запустить файл (Python), вывод на терминал и файл журнала в режиме реального времени?

2
Честно говоря, я бы добавил логирование в сам скрипт. LPChip 5 лет назад 0
@LPChip Я думал об этом, но в реальной ситуации большая часть выходных данных программы поступает из библиотеки, на которую я ссылаюсь - я не хочу заглядывать в нее, чтобы изменить журналирование. Даже если я перегружаю регистратор по умолчанию собственным, я не могу гарантировать, что библиотека тоже этого не делает. Поэтому мне действительно нужен общий подход, который контролирует стандартный вывод и копирует его в файл. Я думал, что это именно то, что `tee` будет делать - может быть, какие-то другие параметры? Greedo 5 лет назад 1

2 ответа на вопрос

1
Greedo

Ну, один подход можно найти здесь

Это нужно использовать ключ -u для изменения режима буферизации самого питона, давая

python -u .\TestShell.py | Tee-Object -FilePath .\fileLog.txt 

Но это не решение для всех языков

1
harrymc

Проблема в том, что PowerShell Tee-Objectне сбрасывает поток вывода, а только ждет, пока источник сделает это, поэтому вы получите вывод в конце операции. Это по замыслу.

Вместо этого используйте этот синтаксис, чтобы записать вывод построчно:

python .\TestShell.py | ForEach-Object { Write-Host $_; $_} | Set-Content .\fileLog.txt 
Кажется, не работает - и журнал, и терминал записываются только в конце выполнения: / PS Я предполагаю, что завершающий `" `является опечаткой Greedo 5 лет назад 0
Является ли это ответом, который находится в контексте [собственного ответа автора плаката] (https://superuser.com/a/1376244/167207)? JakeGould 5 лет назад 0
Должно работать. Странный. harrymc 5 лет назад 0