在Python中运行外部程序(可执行文件)?


92

我刚开始使用Python,并且一直在尝试从Python运行外部可执行文件。

我有一个用Fortran编写的程序的可执行文件。假设可执行文件的名称为flow.exe。我的可执行文件位于中C:\Documents and Settings\flow_model。我同时尝试了os.system和popen命令,但是到目前为止,我无法使其正常工作。以下代码似乎可以打开命令窗口,但不会执行模型。

# Import system modules
import sys, string, os, arcgisscripting
os.system("C:/Documents and Settings/flow_model/flow.exe")

我怎样才能解决这个问题?


Answers:


45

这些空格确实很麻烦:-(.。请尝试os.chdir('C:/Documents\ and\ Settings/')后面的os.systemsubprocess方法或其他相对路径...

如果尽力而为尝试绕过路径中的空白栏不断失败,那么我的下一个最佳建议是避免在关键路径中留空白。你能不能做一个空白较少的目录,复制的关键.exe文件存在,并尝试?那些破坏惨重的空间对您的健康绝对必要吗?


1
亚历克斯,谢谢。这也起作用。如果您不介意,我还有一个问题。如果我的可执行文件要求输入文件的名称怎么办?我尝试使用stdin进行操作,但到目前为止无法成功?
Mesut

2
@mesut,该可执行文件用于“询问”文件名是什么?例如,如果它是其自己的标准输入,则可以使用它subprocess.Popen在此处传递所需的值。如果这样下去,更深(使用“控制台”输入),尝试wexpect,sage.math.washington.edu/home/goreckc/sage/wexpect
Alex Martelli,2009年

输入文件是同一文件夹中的基本.txt文件。现在,代码立即从cmd窗口打开exe。可执行文件要求输入文件的名称。有没有一种方法可以在代码中定义此名称(可能是路径)?我尝试了subprocess.popen,然后尝试查看了变量。我以为我可以使用stdin,但实际上并没有解决。如果您能给我一个带有subprocess.popen的示例,其可执行文件位于C:\ flow_model,可执行文件的名称为flow.exe,而输入文件的名称与sac_bsl.txt位于同一文件夹,则我将不胜感激
Mesut

“询问输入文件的名称”部分很麻烦。正如我已经提到的,不知道该exe的编码方式wexpect是最可能的解决方案,因为它可以让您精确模拟该exe文件在cmd窗口中调用时将看到的内容。
Alex Martelli,2009年

42

如果使用Python 2.7或更高版本(尤其是在Python 3.5之前),则可以使用以下代码:

import subprocess
  • subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) 运行args描述的命令。等待命令完成,然后返回returncode属性。
  • subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) 运行带有参数的命令。等待命令完成。如果返回码为零,则返回,否则引发CalledProcessError。CalledProcessError对象的returncode属性中将包含返回码

例: subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])

在常规Python字符串中,\ U字符组合表示扩展的Unicode代码点转义。

这是文档的链接: http //docs.python.org/3.2/library/subprocess.html

对于Python 3.5+,您现在可以在许多情况下使用run():https : //docs.python.org/3.5/library/subprocess.html#subprocess.run


7
Python 3.6.3建议使用run()
Ricardo Zorio

33

最简单的方法是:

import os
os.startfile("C:\Documents and Settings\flow_model\flow.exe")

有用; 我尝试过这个。


工作正常,但是有没有办法添加-start等参数?
巴瑟姆·沙欣

1
无效:module 'os' has no attribute 'startfile'。(使用python3.6)
not2qubit

显然,它在与Windows相关的任何工具上均不起作用,这与该文档给人的印象相反。
not2qubit

24

如果您是我,我会尝试在路径前面插入一个“ r”,以表明它是原始字符串-这样您就不必使用正斜杠了。例如:

os.system(r"C:\Documents and Settings\flow_model\flow.exe")

19

您的用法是正确的。我敢打赌,您的外部程序flow.exe需要在其目录中执行,因为它可以访问存储在此的一些外部文件。

因此,您可以尝试:

import sys, string, os, arcgisscripting
os.chdir('c:\\documents and settings\\flow_model')
os.system('"C:\\Documents and Settings\\flow_model\\flow.exe"')

(请注意单引号内的双引号...)


完美运行,如何将结果直接存储到数据框中?
萨德(Sade)


7

通过使用os.system

import os
os.system(r'"C:/Documents and Settings/flow_model/flow.exe"')

4

尝试

import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])

尝试过,同样的事情发生了。似乎它打开了cmd窗口,但随后它不运行可执行文件。我单独尝试了可执行文件,它工作正常。我还将该文件夹移动为C:/ flow_model。没有改变。??
Mesut

2

如果是我,我会将EXE文件放在根目录(C :)中,看看它是否能那样工作。如果是这样,则可能是目录名称中的(已经提到)空格。如果不是,则可能是一些环境变量。

另外,尝试检查您的stderr(使用更早的int3答案):

import subprocess
process = subprocess.Popen(["C:/Documents and Settings/flow_model/flow.exe"], \
                           stderr = subprocess.PIPE)
if process.stderr:
    print process.stderr.readlines()

该代码可能并不完全正确,因为我通常不使用Popen或Windows,但应该给出想法。错误消息可能在错误流中。


2
import os
path = "C:/Documents and Settings/flow_model/"
os.chdir(path)
os.system("flow.exe")

1
请添加有关您的代码为何能解决此问题的说明。
rje

这篇文章基本上像对待Windows * .bat文件一样对待正在执行的* .exe文件。
SamAct

2

在python 2.6中,使用括在引号“和撇号'标记内的字符串。也将单/更改为double //。您的工作示例如下所示:

import os
os.system("'C://Documents and Settings//flow_model//flow.exe'") 

另外,如果程序吸收了这些参数,则可以使用任何参数。

os.system('C://"Program Files (x86)"//Maxima-gcl-5.37.3//gnuplot//bin//gnuplot -e "plot [-10:10] sin(x),atan(x),cos(atan(x)); pause mouse"')

最后,您可以使用字符串变量,例如直接从python使用gnuplot进行绘制的示例:

this_program='C://"Program Files (x86)"//Maxima-gcl-5.37.3//gnuplot//bin//gnuplot'

this_par='-e "set polar; plot [-2*pi:2*pi] [-3:3] [-3:3] t*sin(t); pause -1"'
os.system(this_program+" "+this_par)

1

难道是要C:\Documents使用参数来执行"and", "Settings/flow_model/flow.exe"

另外,您可能会考虑subprocess.call()


0

这是正确的用法,但是路径名中的空格可能由于某种原因使事情变得混乱。

您可能还希望在cmd.exe下运行该程序,以便可以查看flow.exe的任何输出,这可能表示错误。


0

存在许多不同的解决方案,其结果在很大程度上取决于:

  • 您使用的操作系统:Windows,Cygwin,Linux,MacOS
  • 您使用的python版本:Python2或Python3x

正如我发现的某些声称只能在Windows中工作的事情那样,事实并非如此,可能是因为我碰巧使用了Cygwin,它比OS处理Windows路径的方式更聪明。其他事情仅适用于基于纯* nix的操作系统或Python2或3。

这是我的发现:

  • 一般来说,os.system()是最宽容的方法。
  • os.startfile()是最不宽容的 (只有Windows &&,如果幸运的话)
  • subprocess.Popen([...]) 推荐
  • subprocess.run(winView, shell=True) 推荐方式!
  • 记住,将其subprocess用于任何用途都可能带来安全风险

试试这些:

import os, subprocess
...
winView = '/cygdrive/c/Windows/explorer.exe %s' % somefile
...
# chose one of these:
os.system(winView)
subprocess.Popen(['/cygdrive/c/Windows/explorer.exe', 'somefile.png'])
subprocess.run(winView, shell=True)

问:为什么要使用 explorer在Windows中?

答:因为如果您只想查看某些新文件的结果,资源管理器将使用您为该文件类型设置的任何默认Windows程序自动打开该文件。因此,无需重新指定要使用的默认程序。


0

对于上述问题,此解决方案有效。

只需更改可执行文件所在的路径即可。

import sys, string, os

os.chdir('C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\\bin64')

os.system("C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\bin64\\flowwork.exe")


'''import sys, string, os

os.chdir('C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\\bin64')

os.system(r"C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\bin64\\pdftopng.exe test1.pdf rootimage")'''

这里的test1.pdf rootimage是我的代码。


你忘了关闭"os.system
Suraj Rao
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.