Перенаправление стандартного вывода на терминал и файла log .txt с помощью Python Subprocess.run()

#python #subprocess #stdout

#python #подпроцесс #стандартный вывод

Вопрос:

Я пытаюсь запустить команду и перенаправить вывод в файл .txt, а также иметь возможность просматривать его в терминале с помощью subprocess.run() . Ранее я использовал 2&&t;amp;1 | file.txt для достижения этой цели, но хотел бы имитировать этот вариант с помощью subprocess.run() и shell = False

В настоящее время я могу успешно перенаправить stdout на .txt. , но я хотел бы иметь возможность видеть это и в терминале. Есть ли способ добиться этого? Я нахожусь на Python 3.6

         with open(model_dest_dir   'Deepspeech_pro&ress.txt', 'w') as f:
             train_model = subprocess.run(train_cmds, shell = False, cwd = '/home/', env =  export_dict, stdout = f)
        #for stdout_line in iter(train_model.stdout.readline, b''):
        #    print(stdout_line)
        f.close()
  

Ответ №1:

Похоже, у меня есть рабочее решение, хотя и не с subprocess.run() . Мне пришлось использовать Popen вот так:

 # train the model and write lo&s to .txt file
with open(model_dest_dir   'Deepspeech_pro&ress.txt', 'w') as f:
    train_model_proc = subprocess.Popen(train_cmds, cwd = '//DeepSpeech/', env =  export_dict, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, universal_newlines = True)  
    for line in train_model_proc.stdout:
        sys.stdout.write(line)
        f.write(line)
train_model_proc.wait() # wait for Popen to finish
f.close()
  

Комментарии:

1. train_cmds='deepspeech --model C:/deepspeech/deepspeech-0.6.0-models/output_&raph.pb --lm C:/deepspeech/deepspeech-0.6.0-models/lm.binary --trie C:/deepspeech/deepspeech-0.6.0-models/trie --audio C:/deepspeech/audio/8455-210777-0068.wav' with open('C:/Deepspeech_pro&ress.txt', 'w') as f: train_model_proc = subprocess.Popen(train_cmds, cwd = 'C:/', stdout = subprocess.PIPE, stderr = subprocess.STDOUT, universal_newlines = True) for line in train_model_proc.stdout: sys.stdout.write(line) f.write(line) train_model_proc.wait() f.close() я пробовал этот cmd, но генерируется пустой файл

2. не могли бы вы, пожалуйста, проверить этот cmd