Я попытался использовать все команды, упомянутые в ответе Byte Commander на вопрос здесь , но они не работают, пока программа не завершится.
Я использую скрипт python, например, «python script.py», и попытался заменить «command» в ответе Byte Commander на «python script.py», однако вывод терминала больше не отображается в терминале ни с одним из команды и записываются в файл output.txt только в том случае, если скрипт python завершается (на самом деле я обнаружил, что он идет большими кусками по мере его прохождения, но не построчно, как мне требуется). Я полагаю, что это может быть потому, что скрипт python вызывает другую не-python программу в другой оболочке (она вызывает пакет конечных элементов, называемый gmesh). Выполнение кода занимает много времени (несколько часов), и я хочу, чтобы вывод полученной информации записывался в файл по мере его продвижения, чтобы я мог видеть, как он работает, и как выглядит вывод терминала, даже если программа вылетает частично , Как я могу быть в состоянии это сделать?
Я добавил видео , чтобы продемонстрировать проблему. Когда программа запускается без захвата, информация поступает построчно. Когда я пытаюсь захватить выходные данные, они поступают в виде фрагментов, когда эти фрагменты занимают часы и во время этого процесса происходит сбой, я не получаю никакой информации о том, где они произошли.
Можно сделать как в следующем примере.
предположим у нас есть сценарий, названный myscript.py
, который похож на это:
import time
for x in range(0, 33):
print("hello", x, flush=True)
time.sleep(1)
Затем, если мы выполняем его как это:
python3 myscript.py > mylog.txt
это зависнет там, пока это не завершится, таким образом, мы не будем видеть вывода, в то время как это работает.
, Чтобы смочь видеть вывод, в то время как это работает, мы можем сделать это вместо этого:
python3 myscript.py > mylog.txt &
, где амперсанд означает, что терминал не зависнет, мы можем дать больше команд, в то время как он работает. Затем мы можем сделать это для рассмотрения содержания файла журнала, в то время как myscript.sh пишет в него:
tail -f mylog.txt
(Другая возможность состоит в том, чтобы открыть отдельное окно терминала и сделать tail -f mylog.txt
оттуда.)
Примечание, что, чтобы это работало, flush=True
часть print
, строка важна, без flush=True
содержание файла, будет только замечено после того, как программа завершается.
В случае, если вывод сгенерирован из некоторой другой программы в Вашем сценарии Python, можно попытаться добавить import sys
и затем сделать sys.stdout.flush()
в коде Python после вызова другой программы. См. https://stackoverflow.com/a/230774/6708867
, Если Вы хотите получить вывод как строку. Попытайтесь следовать за этим:
Var = os.popen(command).read();
Затем журнал это как любое другое содержание.
import subprocess,shlex
command = 'python mesh.py'
workingdirectory = 'C:users/Account/Desktop'
try:
process = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True, cwd=workingdirectory)
stdout, stderr = process.communicate()
if stderr.decode('utf-8') == "":
with open(outputlog.txt, 'w'):
file.write(stdout.decode('utf-8'))
else:
with open(errorlog.txt,'w') as file:
file.write(stderr.decode('utf-8'))
Создают 2 пустых текстовых файла, названные outputlog и errorlog в рабочем каталоге.
Использование Shlex для создания команды, Popen для IPC.