【问题标题】:Opening external program in python在python中打开外部程序
【发布时间】:2021-05-28 20:38:44
【问题描述】:

所以我有一个有点奇怪的新问题,我正在尝试在 Flask 中打开一个外部程序(该程序是用 C++ 编写但编译为 .exe 文件),我可以用 cmd 运行它,我可以通过单击运行它并且它们都可以正常工作,但是当我尝试用 python 打开它们时,程序窗口在我的窗口中启动,然后立即停止,我什至看不到它 1 秒。 关于我的 C++ 程序,它读取一些文本文件的输入,然后在读取后创建更多文本文件。 我已经使用过:subprocess.call、subprocess.Popen、os.startfile、os.system。 我知道我的程序地址是有效的,因为我的应用程序启动但它立即停止。 python中没有错误,使用os.system等时cmd中没有错误。 我很想得到任何建议。 当前代码:

        if request.method == 'POST' and 'checkbox' in request.form:
            if request.form.get("checkbox") is not None:
                os.startfile(r"C:\Users\Administrator\flaskProject\upload\19\29\engine\engine.exe")

【问题讨论】:

  • 为什么subprocess.run() 不用于运行subprocess module 的Python 文档推荐的可执行文件? subprocess 模块在 Windows 上是 Windows 内核库函数 CreateProcess 的 Python 包装器,其结构 STARTUPINFO 在 Windows 上由任何能够启动可执行文件的可执行文件使用。
  • 请同时阅读 os.startfile 的 Python 文档,它不是直接运行可执行文件,而是运行与文件扩展名关联的可执行文件,文件名作为参数传递给可执行文件以打开它由相关应用程序归档。在这种情况下,使用具有结构SHELLEXECUTEINFO 的函数ShellExecuteEx
  • 换句话说os.startfile用于根据用户配置在默认浏览器中打开.html文件或在与该文件扩展名关联的文档处理应用程序中打开.docx文件。没有关联的可执行文件可打开文件扩展名为 .exe 的文件。出于这个原因,os.startfile 是运行像 engine.exe 这样的可执行文件的错误函数。
  • @Mofi 感谢分享这些信息,我已经使用 subprocess.run 对其进行了测试,但我没有运气。当我直接从 python 运行 subprocess.run (没有烧瓶平台)它工作正常,但是当我在烧瓶中的应用程序路由下运行代码时,它不起作用,甚至使我的程序崩溃。我认为烧瓶和根据要求打开外部文件存在问题,但在互联网上甚至烧瓶文档上都没有关于它的信息。

标签: python flask cmd exe


【解决方案1】:

我找到了适合我的情况的解决方案,我认为 Flask 上传模块存在问题,我的 C++ 程序与从 Flask 上传的文件位于同一路径,所以当我更改程序路径并使用 Windows 命令时提示启动程序,一切都像魅力一样。

【讨论】:

  • 换句话说,您的 C++ 编码可执行文件显然编码不好。它可能引用与.exe 文件位于同一目录中的其他文件,但您的代码引用这些文件时没有路径,这意味着相对于当前目录的路径。如果winword.exe (Microsoft Word) 将在您编写可执行文件时进行编码,那么任何人都无法在 Windows 资源管理器中双击打开 .docx 文件。
  • 您应该在 C++ 代码中使用 GetModuleFileName 来获取可执行文件的完整路径,并在打开这些文件时将该路径与存储在同一目录中的文件的每个名称连接起来。然后所有文件都使用完整的限定文件名引用,并且哪个目录是可执行文件的当前目录不再重要。
  • 还可以使用subprocess.run() 和参数cwd="C:\\Users\\Administrator\\flaskProject\\upload\\19\\29\\engine"(或任何其他文件夹路径)来显式定义当前工作目录以供可执行文件运行。如果 Python 脚本文件后来被转换为可执行文件,则文件夹路径可以来自 Python 脚本文件或 Python 可执行文件的存储位置。
猜你喜欢
  • 2016-09-11
  • 2015-10-01
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多