在python中运行一个外部程序(可执行文件)?

我刚开始工作python,我一直在试图运行一个外部的可执行文件forms的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") 

有什么build议吗? 任何帮助将不胜感激。

这些空格可能真的是一个麻烦:-(。尝试os.chdir('C:/Documents\ and\ Settings/')其次是相对path为os.systemsubprocess os.system方法,或任何…

如果尽最大努力绕过空白path的障碍不断失败,那么我的下一个最好的build议是避免在关键path中出现空白。 难道你不能做一个空白的目录,复制关键的.exe文件在那里,并尝试? 那些毁灭性的空间对于你的幸福来说绝对是必不可less的。

如果使用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(["C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])

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

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

如果我是你,我会尝试在你的path前插入一个“r”,以表明它是一个原始的string – 然后你不必使用正斜杠,例如:

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

您的使用是正确的,我敢打赌,您的外部程序,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"' ) 

(小心单引号内的双引号)

最简单的方法是:

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

它的工作原理,我试过了。

通过使用os.system :

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

使用subprocess ,它是一个较小的模块,所以它更快地运行.exe

 import subprocess subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"]) 

尝试

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

如果是我的话,我会把exe文件放在根目录(C :)中,看看它是否可以正常工作。 如果是这样的话,可能是目录名称中的(已经提到的)空格。 如果不是,则可能是一些环境variables。

另外,尝试检查你的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,但应该给出这个想法。 错误消息可能在错误stream上。

是否试图执行参数为"and", "Settings/flow_model/flow.exe" C:\Documents

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

这是正确的用法,但可能由于某些原因,path名称中的空格会造成混乱。

您可能还想在cmd.exe下运行该程序,以便您可以看到flow.exe的任何输出可能指示错误。