Как перенаправить вывод .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()

Обратите внимание, что это решение записывает весь накопленный выход, когда программа заканчивается. Если вы хотите контролировать файл журнала во время прогона. Вы можете попробовать что-то еще. В моем случае я только заботился о конечном результате.