Вот моя проблема. При попытке захватить выходные данные 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 в правильном порядке?






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
Вам нужно общаться с подпроцессом через канал
См. пример https://www.endpoint.com/blog/2015/01/28/getting-realtime-output-using-python.
Попробуйте скопировать/вставить соответствующий код на случай, если срок действия ссылки истечет.
Спасибо за предложение. У меня на винде тоже работает. Для полноты картины я подозреваю, что мне также следует сбросить stderr. Это отлично работает для сценариев Python, которые я написал (или могу изменить). Но для более крупных сценариев, написанных другими, внесение таких изменений может быть проблематичным.