Python调用命令行无窗口显示及subprocess调用bat报错求助
两个问题的解决方案:看不到CMD窗口 & BAT文件启动失败
问题1:为什么os.system('cmd')看不到独立的CMD窗口?
这是因为在PyCharm中运行Python脚本时,os.system()会把命令绑定到当前Python进程的控制台(也就是PyCharm的Run窗口)执行,不会新开独立窗口。它本质是在现有终端会话里启动了一个子shell,所以你只能在PyCharm的控制台里看到CMD的输出,看不到单独的弹窗。
要新开独立的CMD窗口,你需要用Windows自带的start命令,它的作用就是创建新窗口运行指定程序。修改代码如下:
import os os.system('start cmd')
如果还想在新窗口里执行特定命令(比如直接进入目标目录),可以加上参数:
os.system('start cmd /k cd C:\\blabla\\tmp')
这里/k表示执行命令后保持窗口打开,换成/c的话,命令执行完窗口会自动关闭。
问题2:subprocess启动BAT文件报错FileNotFoundError
这个报错的核心原因是:默认情况下subprocess.Popen()不会自动调用Windows的CMD解释器来执行BAT文件——BAT是脚本文件,本身不能直接作为可执行程序运行,必须通过cmd.exe /c来调用它。
你有两种可行的解决方案:
方案1:显式调用CMD执行BAT
把命令改成传入CMD的路径和参数,明确指定要执行的BAT文件:
import subprocess p = subprocess.Popen(['cmd', '/c', 'start_appium.bat'], cwd=r"C:\tmp\scripts") # 注意:Appium服务器是持续运行的常驻进程,调用p.communicate()会让脚本一直阻塞等待进程结束 # 如果你不需要获取输出,直接去掉communicate()即可让Appium后台运行
方案2:设置shell=True
开启shell=True后,subprocess会自动用系统默认shell(Windows下就是CMD)解析命令,这样直接写BAT文件名就能运行:
import subprocess p = subprocess.Popen("start_appium.bat", cwd=r"C:\tmp\scripts", shell=True) # 同样,若无需等待Appium终止,不要调用p.communicate()
内容的提问来源于stack exchange,提问作者falukky




