Проблема с захватом вывода Python из скрипта Python, содержащего subprocess.call()

Вот моя проблема. При попытке захватить выходные данные Python вывод subprocess.call() неправильно появляется перед выводом print(). Я запускаю Python из командного окна, используя Python 3.7.2 в Windows 10.

Вот небольшой пример, иллюстрирующий проблему:

import subprocess

print("test")
subprocess.call("where python",shell=True)

Обратите внимание, что вывод print() должен предшествовать выводу subprocess.call().

Вот что я получаю, когда запускаю без захвата вывода:

c:\Users\GeoffAlexander\Documents\Python>python test.py
test
C:\Users\GeoffAlexander\AppData\Local\Programs\Python\Python37-32\python.exe>
c:\Users\GeoffAlexander\Documents\Python>

Вывод print() правильно появляется перед выводом subprocess.call(), как и ожидалось.

Однако, когда я перенаправляю вывод в файл, вот что я получаю:

c:\Users\GeoffAlexander\Documents\Python>python test.py > test.out

c:\Users\GeoffAlexander\Documents\Python>cat test.out
C:\Users\GeoffAlexander\AppData\Local\Programs\Python\Python37-32\python.exe
test

c:\Users\GeoffAlexander\Documents\Python>

Обратите внимание, что вывод subprocess.call() ошибочно предшествует выводу print().

Почему это происходит? Как я могу захватить вывод Python в правильном порядке?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

How can I capture the Python output in the correct order?

Привет,

Что ж, попробуйте сбросить стандартный вывод после вызова печати, например:

import subprocess
import sys

print("test")
sys.stdout.flush()
subprocess.call("echo python",shell=True)

Вывод будет правильным (проверено в системе Linux):

$ python test.py
test
python
$ python test.py > filename
$ cat filename
test
python

Спасибо за предложение. У меня на винде тоже работает. Для полноты картины я подозреваю, что мне также следует сбросить stderr. Это отлично работает для сценариев Python, которые я написал (или могу изменить). Но для более крупных сценариев, написанных другими, внесение таких изменений может быть проблематичным.

Geoff Alexander 20.02.2019 10:48

Вам нужно общаться с подпроцессом через канал

См. пример https://www.endpoint.com/blog/2015/01/28/getting-realtime-output-using-python.

Попробуйте скопировать/вставить соответствующий код на случай, если срок действия ссылки истечет.

Adrian Krupa 20.02.2019 09:38

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