在Python中运行外部程序(可执行文件)?
我刚刚开始使用Python,我一直在尝试从Python运行外部可执行文件 我有一个用Fortran编写的程序的可执行文件。假设可执行文件的名称为flow.exe。我的可执行文件位于在Python中运行外部程序(可执行文件)?,python,executable,Python,Executable,我刚刚开始使用Python,我一直在尝试从Python运行外部可执行文件 我有一个用Fortran编写的程序的可执行文件。假设可执行文件的名称为flow.exe。我的可执行文件位于C:\Documents And Settings\flow\u model中。我尝试了os.system和popen命令,但到目前为止,我无法使其工作。下面的代码似乎打开了命令窗口,但它不会执行模型 # Import system modules import sys, string, os, arcgisscrip
C:\Documents And Settings\flow\u model
中。我尝试了os.system和popen命令,但到目前为止,我无法使其工作。下面的代码似乎打开了命令窗口,但它不会执行模型
# Import system modules
import sys, string, os, arcgisscripting
os.system("C:/Documents and Settings/flow_model/flow.exe")
如何解决此问题?是指试图执行参数为
“和”,“Settings/flow\u model/flow.exe”
的C:\Documents
也可以考虑<代码>子进程.Car()< /> >
< P> >import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])
这是正确的用法,但可能由于某种原因,路径名中的空格会把事情弄得一团糟
您可能还希望在cmd.exe下运行该程序,以便可以看到flow.exe中可能指示错误的任何输出。这些空白可能真的很麻烦。请尝试
os.chdir('C:/Documents\和\Settings/')
,然后是os.system
、子流程
方法或其他方法的相对路径
如果尽最大努力绕过路径障碍中的空白一直失败,那么我的下一个最佳建议是避免在关键路径中出现空白。难道你不能创建一个空白目录,将关键的
.exe
文件复制到那里,然后尝试那样做吗?如果我是你,我会尝试在你的路径前面插入一个“r”,表示它是一个原始字符串,这样你就不必使用前斜杠了。例如:
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"')
(注意单引号中的双引号…如果是我,我会将EXE文件放在根目录(C:)中,看看它是否可以这样工作。如果是这样,可能是目录名中的(已经提到)空格。如果不是,可能是一些环境变量 此外,请尝试检查您的stderr(使用int3之前的答案): 代码可能不完全正确,因为我通常不使用Popen或Windows,但应该给出想法。很可能错误消息在错误流中。最简单的方法是:
import os
os.startfile("C:\Documents and Settings\flow_model\flow.exe")
它起作用了;我试过了。如果使用Python2.7或更高版本(尤其是在Python3.5之前),您可以使用以下内容:
import subprocess
运行args描述的命令。等待命令完成,然后返回returncode属性subprocess.call(args,*,stdin=None,stdout=None,stderr=None,shell=False)
使用参数运行命令。等待命令完成。如果返回代码为零,则返回,否则将引发CalledProcessError。CalledProcessError对象将在returncode属性中包含返回代码子进程。检查调用(args,*,stdin=None,stdout=None,stderr=None,shell=False)
subprocess.check\u调用([r“C:\pathToYourProgram\yourProgram.exe”,“your”,“arguments”,“逗号”,“separated”])
在常规Python字符串中,\U字符组合表示
扩展的Unicode代码点转义
以下是指向文档的链接:
对于Python 3.5+,现在可以在许多情况下使用run():使用子流程,它是一个更小的模块,因此运行
.exe
更快
import subprocess
subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])
通过使用:
对于上述问题,此解决方案有效 只需更改可执行文件所在的路径
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是我的代码。有大量不同的解决方案,结果将强烈依赖于:
import os
path = "C:/Documents and Settings/flow_model/"
os.chdir(path)
os.system("flow.exe")
- 您正在使用的操作系统:Windows、Cygwin、Linux、MacOS
- 您正在使用的python版本:Python2或Python3x
- 一般来说,
是最宽容的方法os.system()
是最不宽容的。(仅限Windows&如果幸运的话)os.startfile()
不推荐subprocess.Popen([…])
推荐的方法李>subprocess.run(winView,shell=True)
- 记住,对任何事情使用
,都可能造成安全风险子流程
导入操作系统,子流程
...
winView='/cygdrive/c/Windows/explorer.exe%s'%1!'
...
#选择以下选项之一:
操作系统(winView)
subprocess.Popen(['/cygdrive/c/Windows/explorer.exe','somefile.png'])
subprocess.run(winView,shell=True)
问:为什么要在Windows中使用资源管理器
答:因为如果您只想查看某个新文件的结果,资源管理器将使用您为该文件类型设置的默认windows程序自动打开该文件。因此,无需重新指定要使用的默认程序 在Python2.6中,使用括在引号内的字符串“和撇号”,并将single/更改为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)
尝试了它,同样的事情也发生了。它似乎打开了cmd窗口,但它无法运行可执行文件。我单独尝试了可执行文件,效果很好。我还将文件夹移动为C:/flow\u model。没有什么不同。?Alex,谢谢。这也很有效。我有
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"')
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)