在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.system
, subprocess
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的任何输出可能指示错误。