Как перенаправить вывод .exe в файл в python? - PullRequest
16 голосов
/ 19 мая 2009

В скрипте я хочу запустить .exe с некоторыми параметрами командной строки, такими как -a, а затем

перенаправить стандартный вывод программы в файл?

Как я могу это реализовать?

Ответы [ 5 ]

26 голосов
/ 19 мая 2009

Вы можете перенаправить напрямую в файл, используя подпроцесс.

import subprocess
with open('output.txt', 'w') as output_f:
    p = subprocess.Popen('Text/to/execute with-arg',
                         stdout=output_f,
                         stderr=output_f)
9 голосов
/ 19 мая 2009

Самый простой - os.system("the.exe -a >thefile.txt"), но есть много других способов, например, с модулем subprocess в стандартной библиотеке.

3 голосов
/ 19 мая 2009

Вы можете сделать что-то вроде этого например читать вывод команды ls -l (или любой другой команды)

p = subprocess.Popen(["ls","-l"],stdout=subprocess.PIPE)
print p.stdout.read() # or put it in a file

вы можете сделать то же самое для stderr / stdin

но, как сказал Алекс, если вы просто хотите, чтобы это было в файле, просто перенаправьте вывод cmd в файл

0 голосов
/ 21 февраля 2013

Хотя название (.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()

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

0 голосов
/ 19 мая 2009

Если вы просто хотите запустить исполняемый файл и дождаться результатов, решение Anurag, вероятно, будет лучшим. Мне нужно было ответить на каждую строку вывода по мере ее поступления, и обнаружил, что работает следующее:

1) Создайте объект с помощью метода записи (текста). Перенаправьте на него стандартный вывод (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()

Поскольку вы перенаправили стандартный вывод, PIPE построчно отправит вывод вашему методу записи. Если вы не уверены, что получите разрывы строк, я считаю, что чтение (количество) тоже работает.

3) Не забудьте перенаправить стандартный вывод обратно по умолчанию: sys.stdout = __sys.stdout__

...