Как перенаправить вывод .exe в файл в python?
В script, я хочу запустить .exe с некоторыми параметрами командной строки как "-a", а затем
перенаправить стандартный вывод программы в файл?
Как это реализовать?
Ответы
Ответ 1
Вы можете перенаправить непосредственно в файл с помощью подпроцесса.
import subprocess
with open('output.txt', 'w') as output_f:
p = subprocess.Popen('Text/to/execute with-arg',
stdout=output_f,
stderr=output_f)
Ответ 2
Самый простой - os.system("the.exe -a >thefile.txt")
, но есть много других способов, например, с модулем subprocess
в стандартной библиотеке.
Ответ 3
Вы можете сделать что-то вроде этого
например для чтения вывода ls -l (или любой другой команды)
p = subprocess.Popen(["ls","-l"],stdout=subprocess.PIPE)
print p.stdout.read() # or put it in a file
вы можете сделать аналогичную вещь для stderr/stdin
но, как сказал Алекс, если вы просто хотите его в файле, просто перенаправьте вывод cmd в файл
Ответ 4
Если вы просто хотите запустить исполняемый файл и дождаться результатов, решение Anurag, вероятно, будет лучшим. Мне нужно было ответить на каждую строку вывода по мере ее поступления и найти следующее:
1) Создайте объект с помощью метода write (text). Переназначить stdout к нему (sys.stdout = obj). В вашем методе записи обработайте вывод по мере его поступления.
2) Запустите метод в отдельном потоке с чем-то вроде следующего кода:
p = subprocess.Popen('Text/to/execute with-arg', stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=False)
while p.poll() is None:
print p.stdout.readline().strip()
Поскольку вы перенаправили stdout, PIPE будет отправлять вывод методу записи по очереди. Если вы не уверены в том, что получите разрывы строк, читайте (количество) тоже, я полагаю.
3) Не забудьте перенаправить stdout обратно на значение по умолчанию: sys.stdout = __sys.stdout__
Ответ 5
Хотя заголовок (.exe) звучит как проблема в Windows.
Мне пришлось поделиться тем, что принятый ответ (subprocess.Popen() с аргументами stdout/stderr) не работал у меня в Mac OS X (10.8) с помощью python 2.7.
Мне пришлось использовать subprocess.check_output() (python 2.7 и выше), чтобы заставить его работать. Пример:
import subprocess
cmd = 'ls -l'
out = subprocess.check_output(cmd, shell=True)
with open('my.log', 'w') as f:
f.writelines(out)
f.close()
Обратите внимание, что это решение записывает весь накопленный выход, когда программа заканчивается.
Если вы хотите контролировать файл журнала во время прогона. Вы можете попробовать что-то еще.
В моем случае я только заботился о конечном результате.