Использование python для запуска другой программы?

У меня есть программа, которую я запускаю из командной строки, которая выглядит так:

$ program a.txt b.txt

Программа требует два текстовых файла в качестве аргументов. Я пытаюсь написать скрипт Python 3.2 для запуска вышеуказанной программы. Как я могу это сделать? В настоящее время я пытаюсь использовать модуль subprocess следующим образом:

import subprocess

with open("a.txt", mode="r") as file_1:
    with open("b.txt", mode="r") as file_2:
        cmd = ['/Users/me/src/program', file_1, file_2]
        process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
        for line in process.stdout:
            print(line)

Я прочитал это сообщение и сообщение здесь, которые кажутся опишите аналогичные решения моей проблемы. К сожалению, после прочтения этих сообщений я все еще не могу заставить свой код Python запускать мою программу.

Кто-нибудь может помочь? Заранее спасибо!


person drbunsen    schedule 04.08.2011    source источник


Ответы (4)


subprocess.Popen ожидает массив строк. Два элемента в этом массиве являются дескрипторами файлов. Вам нужно передать фактическое имя файла программе, которую вы пытаетесь запустить.

cmd = ['/Users/me/src/program', 'a.txt', 'b.txt']

Вы можете полностью избавиться от строк with open(...) as ....

person Chris Eberle    schedule 04.08.2011
comment
Спасибо за помощь, я как-то пропустил, что subprocess.Popen() требует строк, а не файловых дескрипторов. Ваше решение сработало как шарм! - person drbunsen; 04.08.2011

Посмотрите @Chris answer, а также:

Подпроцесс не ждет завершения команды, поэтому следует использовать метод wait.

process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
process.wait()
for line in process.stdout:
    print(line)
person utdemir    schedule 04.08.2011
comment
Спасибо за указание на метод wait - я не знал об этом. - person drbunsen; 04.08.2011
comment
Если вам нужны линии, пока он еще работает, см. мой ответ. - person agf; 04.08.2011

В зависимости от ваших требований os.system(cmdline) может быть самым простым решением.

person Achim    schedule 04.08.2011

Использование subprocess.wait() с stdout=subprocess.PIPE не рекомендуется.

with subprocess.Popen(cmd, stdout=subprocess.PIPE) as proc:
    print(proc.stdout.read())

Вам не нужно звонить subprocess.wait(). Это напечатает стандартный вывод в реальном времени proc, а родительский процесс будет ждать завершения proc.

Проверьте эти URL-адреса для получения дополнительной информации.

person SHIM    schedule 15.04.2019