Python如何在外部独立终端中运行.exe可执行文件
问题说明
需要从Python脚本中启动指定exe程序,要求程序弹出独立的外部终端窗口运行,而非占用Python脚本所在的当前终端窗口。原有启动代码如下:
import subprocess subprocess.call(["C:/Users/Alessandro/Downloads/BOSCH-GLM/BOSCH-GLM/dist/glm50.exe"])
可行解决方案(从路径判断当前运行环境为Windows系统)
该问题的本质是直接调用exe时,子进程默认继承了父进程(Python脚本)的控制台窗口,只需要在启动子进程时指定创建独立控制台即可,有两种成熟实现方式:
方法1:通过系统start命令启动
Windows自带的start命令默认会为新启动的程序分配独立终端窗口,通过cmd调用该命令启动目标程序即可:
import subprocess exe_path = "C:/Users/Alessandro/Downloads/BOSCH-GLM/BOSCH-GLM/dist/glm50.exe" # 注意start后的空字符串是新终端的窗口标题参数,必须保留,否则带空格、引号的路径会被误识别为窗口标题导致启动失败 subprocess.Popen( ["cmd.exe", "/c", "start", "", exe_path], shell=False )
如果需要程序运行结束后保留终端窗口查看输出日志,可以把启动参数改成["cmd.exe", "/c", "start", "", "cmd.exe", "/k", exe_path],终端不会在程序退出后自动关闭。
方法2:通过进程创建标志指定新控制台
直接调用Windows系统的进程创建参数,给子进程分配全新的控制台窗口,不需要依赖cmd中转:
import subprocess exe_path = "C:/Users/Alessandro/Downloads/BOSCH-GLM/BOSCH-GLM/dist/glm50.exe" # Windows系统定义的新控制台创建标志 CREATE_NEW_CONSOLE = 0x00000010 subprocess.Popen( exe_path, creationflags=CREATE_NEW_CONSOLE )
注意事项
- 替换原代码里的
subprocess.call为subprocess.Popen:call方法会阻塞当前Python脚本,直到启动的exe退出才会继续执行后续代码,Popen是异步启动,启动exe后Python脚本会正常往下运行,不会卡住。 - 如果需要给目标exe传递启动参数,直接把参数按顺序追加到传入Popen的列表里即可,比如传参
-p 8080就写成[exe_path, "-p", "8080"]。 - 如果需要隐藏新终端的窗口,可以额外定义
CREATE_NO_WINDOW = 0x08000000标志,和CREATE_NEW_CONSOLE做位或运算后传入creationflags参数即可。
内容的提问来源于stack exchange,提问作者Alessandro Chiodo
相关产品推荐
相关产品推荐

