Использование python для запуска другой программы?
У меня есть программа, которую я запускаю из командной строки, которая выглядит так:
$ program a.txt b.txt
Программа требует двух текстовых файлов в качестве аргументов. Я пытаюсь написать Python 3.2 script для запуска указанной выше программы. Как я могу это сделать? В настоящее время я пытаюсь использовать модуль 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 запускать свою программу.
Может ли кто-нибудь помочь? Спасибо заранее!
Ответы
Ответ 1
subprocess.Popen
ожидает массив строк. Два элемента в этом массиве - это дескрипторы файлов. Вам необходимо передать фактическое имя файла программе, которую вы пытаетесь запустить.
cmd = ['/Users/me/src/program', 'a.txt', 'b.txt']
Вы можете полностью избавиться от строк with open(...) as ...
.
Ответ 2
Посмотрите @Chris answer, а также:
Subprocess не ждет завершения команды, поэтому вы должны использовать метод wait
.
process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
process.wait()
for line in process.stdout:
print(line)
Ответ 3
В зависимости от ваших требований os.system(cmdline)
может быть простым решением.
Ответ 4
Использование subprocess.wait()
с stdout=subprocess.PIPE
не рекомендуется.
with subprocess.Popen(cmd, stdout=subprocess.PIPE) as proc:
print(proc.stdout.read())
Вам не нужно вызывать subprocess.wait()
. Это выведет стандартный вывод proc
реальном времени, а родительский процесс будет ожидать завершения proc
.
Проверьте эти URL для получения дополнительной информации.
https://docs.python.org/3.5/library/subprocess.html#popen-objects https://docs.python.org/3.5/library/subprocess.html#popen-constructor