我刚开始使用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")
我该如何解决这个问题?
答案 0 :(得分:40)
如果使用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对象将在返回码属性示例:subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])
在常规Python字符串中,\ U字符组合表示a 扩展的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
答案 1 :(得分:37)
那些空格真的很麻烦:-(。尝试os.chdir('C:/Documents\ and\ Settings/')
后跟os.system
,subprocess
方法的相对路径,或者其他......
如果尽力而为试图绕过路径中的空白障碍继续失败,那么我的下一个最佳建议是避免在关键路径中出现空白。难道你不能制作一个空白的目录,在那里复制关键的.exe
文件,然后尝试那个?那些破坏性破坏的空间对你的健康来说绝对必不可少......?
答案 2 :(得分:21)
如果我是你,我会尝试在你的路径前插入'r'来表示它是一个原始字符串 - 然后你就不必使用正斜杠了。例如:
os.system(r"C:\Documents and Settings\flow_model\flow.exe")
答案 3 :(得分:21)
最简单的方法是:
import os
os.startfile("C:\Documents and Settings\flow_model\flow.exe")
有效;我试过了。
答案 4 :(得分: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"')
(注意单引号内的双引号......)
答案 5 :(得分:9)
使用子流程,它是一个较小的模块,因此可以更快地运行.exe
。
import subprocess
subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])
答案 6 :(得分:7)
使用os.system:
import os
os.system(r'"C:/Documents and Settings/flow_model/flow.exe"')
答案 7 :(得分:3)
尝试
import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])
答案 8 :(得分:1)
是否尝试使用C:\Documents
的参数执行"and", "Settings/flow_model/flow.exe"
?
另外,您可以考虑subprocess.call()
。
答案 9 :(得分:1)
如果是我,我会将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,但应该提出这个想法。可能是错误消息在错误流上。
答案 10 :(得分:0)
这是正确的用法,但是路径名中的空格可能由于某种原因搞乱了。
您可能还希望在cmd.exe下运行该程序,以便您可以看到flow.exe中可能指示错误的任何输出。
答案 11 :(得分:0)
对于上述问题,此解决方案有效。
只需更改可执行文件所在的路径即可。
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\\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用于我的代码。
答案 12 :(得分:0)
import os
path = "C:/Documents and Settings/flow_model/"
os.chdir(path)
os.system("flow.exe")
答案 13 :(得分:0)
有很多不同的解决方案,其结果在很大程度上取决于:
正如我发现的一些声称只能在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)
问:为什么要在Windows中使用 explorer
?
A:因为如果您只想查看某些新文件的结果,资源管理器将使用您为该文件类型设置的任何默认Windows程序自动打开该文件。因此,无需重新指定要使用的默认程序。
答案 14 :(得分:0)
使用括在引号“和撇号'内的字符串,也可以将单/更改为双//。 您的工作示例将如下所示:
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)