Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中运行外部程序(可执行文件)?_Python_Executable - Fatal编程技术网

在Python中运行外部程序(可执行文件)?

在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

我刚刚开始使用Python,我一直在尝试从Python运行外部可执行文件

我有一个用Fortran编写的程序的可执行文件。假设可执行文件的名称为flow.exe。我的可执行文件位于
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
  • subprocess.call(args,*,stdin=None,stdout=None,stderr=None,shell=False)
    运行args描述的命令。等待命令完成,然后返回returncode属性
  • 子进程。检查调用(args,*,stdin=None,stdout=None,stderr=None,shell=False)
    使用参数运行命令。等待命令完成。如果返回代码为零,则返回,否则将引发CalledProcessError。CalledProcessError对象将在returncode属性中包含返回代码
示例:
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
我发现了一些声称只在Windows中工作的东西,但事实并非如此,这可能是因为我碰巧使用了Cygwin,它比操作系统处理Windows路径的方式更出色。其他东西只能在基于纯*nix的操作系统或Python2或3中工作

以下是我的发现:

  • 一般来说,
    os.system()
    是最宽容的方法
  • os.startfile()
    是最不宽容的。(仅限Windows&如果幸运的话)
  • 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)