Как перехватить вывод терминала в процессе выполнения?

Я попытался использовать все команды, упомянутые в ответе Byte Commander на вопрос здесь , но они не работают, пока программа не завершится.

Я использую скрипт python, например, «python script.py», и попытался заменить «command» в ответе Byte Commander на «python script.py», однако вывод терминала больше не отображается в терминале ни с одним из команды и записываются в файл output.txt только в том случае, если скрипт python завершается (на самом деле я обнаружил, что он идет большими кусками по мере его прохождения, но не построчно, как мне требуется). Я полагаю, что это может быть потому, что скрипт python вызывает другую не-python программу в другой оболочке (она вызывает пакет конечных элементов, называемый gmesh). Выполнение кода занимает много времени (несколько часов), и я хочу, чтобы вывод полученной информации записывался в файл по мере его продвижения, чтобы я мог видеть, как он работает, и как выглядит вывод терминала, даже если программа вылетает частично , Как я могу быть в состоянии это сделать?

Я добавил видео , чтобы продемонстрировать проблему. Когда программа запускается без захвата, информация поступает построчно. Когда я пытаюсь захватить выходные данные, они поступают в виде фрагментов, когда эти фрагменты занимают часы и во время этого процесса происходит сбой, я не получаю никакой информации о том, где они произошли.

1
задан 3 October 2019 в 14:46

3 ответа

Можно сделать как в следующем примере.

предположим у нас есть сценарий, названный 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

0
ответ дан 23 October 2019 в 09:27

, Если Вы хотите получить вывод как строку. Попытайтесь следовать за этим:

Var = os.popen(command).read();

Затем журнал это как любое другое содержание.

0
ответ дан 23 October 2019 в 09:27
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.

0
ответ дан 23 October 2019 в 09:27

Другие вопросы по тегам:

Похожие вопросы: