在Python中运行外部程序(可执行文件)?
我刚刚开始研究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")
我怎样才能解决这个问题?
Mesut asked 2019-06-11T19:42:19Z
14个解决方案
37 votes
如果使用Python 2.7或更高版本(特别是在Python 3.5之前),您可以使用以下内容:
import subprocess
subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])运行args描述的命令。 等待命令完成,然后返回returncode属性。
subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])用参数运行命令。 等待命令完成。 如果返回码为零则返回,否则引发CalledProcessError。 CalledProcessError对象将在returncode属性中包含返回代码
示例: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]
Ida N answered 2019-06-11T19:43:45Z
35 votes
那些空格真的很麻烦:-(。尝试.exe,然后是os.system,subprocess方法的相对路径,或者其他......
如果尽力而为试图绕过路径中的空白障碍继续失败,那么我的下一个最佳建议是避免在关键路径中出现空白。 难道你不能制作一个没有空白的目录,在那里复制关键的.exe文件,然后试试吗? 这些破坏性破坏的空间对你的健康是绝对必要的吗?
Alex Martelli answered 2019-06-11T19:42:40Z
19 votes
最简单的方法是:
import os
os.startfile("C:\Documents and Settings\flow_model\flow.exe")
有用; 我尝试过这个。
Someone answered 2019-06-11T19:44:12Z
18 votes
如果我是你,我会尝试在你的路径前插入一个'r'来表示它是一个原始字符串 - 然后你就不必使用正斜杠了。 例如:
os.system(r"C:\Documents and Settings\flow_model\flow.exe")
Jon Mills answered 2019-06-11T19:44:36Z
18 votes
你的用法是正确的。 我打赌你的外部程序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"')
(注意单引号内的双引号......)
Adrien Plisson answered 2019-06-11T19:45:14Z
8 votes
使用子进程,它是一个较小的模块,因此它可以更快地运行.exe。
import subprocess
subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])
Frodo Baggins answered 2019-06-11T19:45:39Z
6 votes
通过使用os.system:
import os
os.system(r'"C:/Documents and Settings/flow_model/flow.exe"')
romy answered 2019-06-11T19:46:04Z
3 votes
尝试
import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])
int3 answered 2019-06-11T19:46:23Z
1 votes
这是否试图执行subprocess.call()参数为"and", "Settings/flow_model/flow.exe"?
另外,您可以考虑subprocess.call()。
Thanatos answered 2019-06-11T19:46:55Z
1 votes
如果是我,我会将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,但应该给出这个想法。 可能是错误消息在错误流上。
extraneon answered 2019-06-11T19:47:35Z
0 votes
这是正确的用法,但也许路径名中的空格由于某种原因弄乱了。
您可能还希望在cmd.exe下运行该程序,以便可以看到flow.exe中可能指示错误的任何输出。
Dan Olson answered 2019-06-11T19:48:07Z
0 votes
对于上述问题,此解决方案有效。
只需更改可执行文件所在的路径即可。
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是我的代码。
spurthi answered 2019-06-11T19:48:46Z
0 votes
import os
path = "C:/Documents and Settings/flow_model/"
os.chdir(path)
os.system("flow.exe")
John answered 2019-06-11T19:49:04Z
0 votes
有许多不同的解决方案,结果将强烈依赖于:
您正在使用的操作系统:Windows,Cygwin,Linux,MacOS
您正在使用的python版本:Python2或Python3x
因为我发现了一些声称仅在Windows中工作的东西,但是,可能是因为我碰巧使用Cygwin,这超出了操作系统处理Windows路径的方式。 其他东西只适用于基于纯* nix的操作系统或Python2或3。
以下是我的发现:
一般来说,explorer是最宽容的方法。
explorer是最不宽容的。 (仅限Windows,如果你很幸运,还有&&)
explorer不推荐
推荐的方式是explorer!
请记住,对任何事物使用explorer可能会带来安全隐患。
试试这些:
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?
答:因为如果您只想查看某些新文件的结果,资源管理器将自动打开该文件,其中包含您为该文件类型设置的任何默认Windows程序。 因此无需重新指定要使用的默认程序。
not2qubit answered 2019-06-11T19:50:46Z