如何从Python脚本中调用可执行文件?

25
我需要从我的Python脚本中执行这个脚本。
这是否可能?该脚本生成一些输出,并写入一些文件。我该如何访问这些文件?我已经尝试使用subprocess调用函数,但没有成功。
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

1
subprocess是你需要使用的,你能提供一个例子,这样我们就能更好地了解为什么它没有工作吗? - Kaleb Pederson
"subprocess call"是什么?请发布您使用的代码和实际收到的错误。 - S.Lott
是的,他在谈论标准“subprocess”模块中的“call”函数,这是更好的方式来做到这一点,尽管根据他的需求,os.system也可能是足够的。 - Peter Lyons
嗨,Kaleb,我编辑了这个问题。 - fx.
3个回答

46

执行外部程序,请按照以下步骤进行:

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") 打开它们。请注意,如果您不想,您无需依赖子Shell将输出重定向到名为“output”的磁盘文件上。这里展示了如何直接读取输出到您的Python程序,而不需要在中间存储到磁盘。


嗨,Peter,出现了错误:bin/bar: bin/bar: 无法执行二进制文件,并且没有其他来自Python运行时的信息。这是什么原因? - fx.
关于可执行文件的错误,我已经解决了,谢谢Peter。 - fx.

20

最简单的方法是:

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

您可以通过使用open()来通常的方式访问文件。

如果您需要进行更复杂的子进程管理,则可以使用subprocess模块。


1
请注意,这与subprocess.Popen(shell=True)具有相同的安全警告。不要将其与除文字字符串以外的任何内容一起使用。 - Brian McCutchon
我想在我的文件夹中对每个文件执行tesseract,所以我使用os.walk并在循环中执行程序。它如何工作? - Timo

9

执行Unix可执行文件。在我的Mac OSX上,我按照以下步骤操作并成功运行:

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

这里的print(so)输出结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接