Как вызвать исполняемый файл из скрипта Python?

Мне нужно выполнить этот сценарий из моего сценария Python.

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

fx@fx-ubuntu:~/Documents/projects/foo$ bin/bar -c somefile.xml -d text.txt -r aString -f anotherString >output

Приложение «bar» также ссылается на некоторые библиотеки, оно также создает файл «bar.xml» помимо вывода. Как мне получить доступ к этим файлам? Просто используя open ()?

Спасибо,

Изменить:

Ошибка из среды выполнения Python - только эта строка.

$ python foo.py
bin/bar: bin/bar: cannot execute binary file

person fx.    schedule 18.03.2010    source источник
comment
subprocess - это то, что вам нужно использовать, можете ли вы привести пример, чтобы мы лучше понимали, почему это не сработало?   -  person Kaleb Pederson    schedule 19.03.2010
comment
вызов подпроцесса? Что это? Пожалуйста, опубликуйте код, который вы использовали, и фактическую ошибку.   -  person S.Lott    schedule 19.03.2010
comment
Да, он говорит о функции вызова в стандартном модуле подпроцесса, что является лучшим способом сделать это, хотя os.system может подойти в зависимости от его потребностей.   -  person Peter Lyons    schedule 19.03.2010
comment
Привет, Калеб, я редактировал вопрос.   -  person fx.    schedule 19.03.2010


Ответы (3)


Для выполнения внешней программы сделайте следующее:

import subprocess
args = ("bin/bar", "-c", "somefile.xml", "-d", "text.txt", "-r", "aString", "-f", "anotherString")
#Or just:
#args = "bin/bar -c somefile.xml -d text.txt -r aString -f anotherString".split()
popen = subprocess.Popen(args, stdout=subprocess.PIPE)
popen.wait()
output = popen.stdout.read()
print output

И да, если ваша bin/bar программа записала на диск несколько других файлов, вы можете открыть их как обычно с помощью open("path/to/output/file.txt"). Обратите внимание, что вам не нужно полагаться на подоболочку для перенаправления вывода в файл на диске с именем «output», если вы этого не хотите. Я показываю здесь, как напрямую считывать вывод в вашу программу Python, не переходя между ними на диск.

person Peter Lyons    schedule 19.03.2010
comment
Привет, Питер, есть ошибка: bin / bar: bin / bar: невозможно выполнить двоичный файл и без какой-либо другой информации из среды выполнения Python. В чем причина? - person fx.; 19.03.2010
comment
это об ошибке исполняемого файла. Я решил это, спасибо Питер. - person fx.; 20.03.2010

Самый простой способ:

import os
cmd = 'bin/bar --option --otheroption'
os.system(cmd) # returns the exit status

Вы получаете доступ к файлам обычным способом, используя open().

Если вам нужно выполнить более сложное управление подпроцессами, то вам подойдет модуль subprocess.

person rz.    schedule 18.03.2010
comment
Обратите внимание, что здесь содержится та же мера безопасности, что и для subprocess.Popen(shell=True). Не используйте его ни с чем, кроме буквальной строки. - person Brian McCutchon; 01.05.2019
comment
Я хочу выполнить tesseract для каждого файла в моей папке, поэтому я os.walk, а затем выполняю программу в цикле. Как это работает? - person Timo; 11.11.2020

Для выполнения исполняемого файла unix. Я сделал следующее в своей Mac OSX, и у меня это сработало:

import os
cmd = './darknet classifier predict data/baby.jpg'
so = os.popen(cmd).read()
print so

Здесь print so выводит результат.

person Sumesh Chandran    schedule 04.06.2018