【问题标题】:Running an outside program (executable) in Python?在 Python 中运行外部程序(可执行文件)?
【发布时间】:2010-12-21 04:00:32
【问题描述】:

我刚开始使用 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")

我该如何解决这个问题?

【问题讨论】:

标签: python executable


【解决方案1】:

那些空格真的很麻烦。尝试os.chdir('C:/Documents\ and\ Settings/'),后跟os.systemsubprocess 方法或其他方法的相对路径...

如果尽力绕过路径中的空格障碍的尝试一直失败,那么我的下一个最佳建议是避免在您的关键路径中出现空格。难道你不能创建一个无空格的目录,将重要的.exe 文件复制到那里,然后尝试那个?这些破坏性的空间对您的幸福来说绝对是必不可少的吗...?

【讨论】:

  • 亚历克斯,谢谢。这也奏效了。如果你不介意,我还有一个问题。如果我的可执行文件询问我的输入文件的名称怎么办?我尝试使用标准输入,但到目前为止还没有成功?
  • @mesut,用于“请求”文件名的可执行文件是什么?例如,如果它是它自己的标准输入,您可能可以使用subprocess.Popen 在那里传递您想要的值。如果它更深入(使用“控制台”输入),请尝试 wexpect,sage.math.washington.edu/home/goreckc/sage/wexpect
  • 输入文件是同一文件夹中的基本 .txt 文件。代码现在从 cmd 窗口打开 exe。并且可执行文件要求输入文件的名称。有没有一种方法可以在代码中定义这个名称(可能是路径)?我尝试了 subprocess.popen 并尝试查看变量。我以为我可以使用标准输入,但并没有真正奏效。如果您能给我一个带有 subprocess.popen 的示例,可执行文件位于 C:\flow_model 中,可执行文件的名称为 flow.exe,输入文件的名称与 sac_bsl.txt 位于同一文件夹中,我将不胜感激/跨度>
  • “询问输入文件的名称”部分是比较麻烦的部分。正如我已经提到的,不知道该 exe 是如何编码的,wexpect 是最可能的解决方案,因为它可以让您准确模拟在 cmd 窗口调用时该 exe 文件会看到什么。
【解决方案2】:

对于上述问题,此解决方案有效。

只需更改可执行文件所在的路径即可。

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 是我的代码。

【讨论】:

  • 您是否忘记在os.system 中结束"
【解决方案3】:

在 python 2.6 中使用引号括起来的字符串 " 和撇号 ' 标记。还将单 / 更改为双 //。 您的工作示例将如下所示:

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)

【讨论】:

    【解决方案4】:

    有很多不同的解决方案,结果很大程度上取决于:

    • 您使用的操作系统: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)推荐的方式!
    • 请记住,将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 程序打开该文件。因此无需重新指定要使用的默认程序。

    【讨论】:

      【解决方案5】:
      import os
      path = "C:/Documents and Settings/flow_model/"
      os.chdir(path)
      os.system("flow.exe")
      

      【讨论】:

      • 请说明您的代码为何能解决这个问题。
      • 这篇文章基本上是在处理正在执行的 *.exe 文件,就像使用 windows *.bat 文件一样。
      【解决方案6】:

      如果使用 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([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])

      在常规 Python 字符串中,\U 字符组合表示 扩展的 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

      【讨论】:

      • Python 3.6.3 推荐run()
      【解决方案7】:

      最简单的方法是:

      import os
      os.startfile("C:\Documents and Settings\flow_model\flow.exe")
      

      有效;我试过了。

      【讨论】:

      • 工作正常,但是有没有办法添加-start之类的参数?
      • 不起作用:module 'os' has no attribute 'startfile'。 (使用python3.6)
      • 显然在任何与 Windows 相关的东西上都不起作用,这与 documentation 给人的印象相反。
      【解决方案8】:

      如果是我,我会把 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,但应该给出想法。很可能是错误消息在错误流上。

      【讨论】:

        【解决方案9】:

        你的用法是正确的。我敢打赌,您的外部程序 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"')
        

        (注意单引号内的双引号...)

        【讨论】:

        • 完美运行,如何将结果直接存储到数据框?
        【解决方案10】:

        如果我是你,我会尝试在你的路径前面插入一个“r”,以表明它是一个原始字符串 - 然后你就不必使用正斜杠了。例如:

        os.system(r"C:\Documents and Settings\flow_model\flow.exe")
        

        【讨论】:

        • 这里的主要问题是里面的空格,你的建议很好但没有解决主要问题
        【解决方案11】:

        这是试图用"and", "Settings/flow_model/flow.exe" 的参数执行C:\Documents 吗?

        另外,你可以考虑subprocess.call()

        【讨论】:

          【解决方案12】:

          通过使用os.system

          import os
          os.system(r'"C:/Documents and Settings/flow_model/flow.exe"')
          

          【讨论】:

            【解决方案13】:

            使用 subprocess,它是一个较小的模块,因此它可以更快地运行.exe

            import subprocess
            subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])
            

            【讨论】:

            • 你的意思是 开始.exe 更快?
            【解决方案14】:

            这是正确的用法,但路径名中的空格可能出于某种原因搞砸了。

            您可能还想在 cmd.exe 下运行该程序,这样您就可以看到 flow.exe 中可能指示错误的任何输出。

            【讨论】:

              【解决方案15】:

              试试

              import subprocess
              subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])
              

              【讨论】:

              • 试过了,同样的事情发生了。似乎它打开了 cmd 窗口,但它不会运行可执行文件。我单独尝试了可执行文件,它工作正常。我还将文件夹移动为 C:/flow_model。没区别。??
              猜你喜欢
              • 2013-08-27
              • 1970-01-01
              • 2022-01-12
              • 1970-01-01
              • 2012-10-24
              • 2022-01-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多