如何使用Python subprocess打开新终端窗口并持续发送命令执行
解决用subprocess向新开终端窗口持续发命令的问题
问题根源
你的代码不生效的核心原因有两点:
start cmd的逻辑是启动一个独立的新cmd进程,subprocess.Popen拿到的是start命令本身的进程对象,不是新开的终端窗口对应的cmd进程,你往i.stdin写入的内容无法传递到目标cmd窗口,因此后续命令不会执行- 你同时绑定了
stdout=subprocess.PIPE,会导致cmd的输出被拦截到管道中,无法直接展示在新终端窗口内,不符合你的需求
正确实现代码
import subprocess import time # 直接启动独立cmd窗口,不捕获输出让内容直接展示在新窗口 cmd_process = subprocess.Popen( "cmd.exe", creationflags=subprocess.CREATE_NEW_CONSOLE, stdin=subprocess.PIPE, text=True ) # 执行第一个命令tree cmd_process.stdin.write("tree\r\n") cmd_process.stdin.flush() time.sleep(2) # 可根据命令执行时长调整等待时间,也可按需移除 # 执行第二个命令echo hi cmd_process.stdin.write("echo hi\r\n") cmd_process.stdin.flush() time.sleep(1) # 可继续追加任意命令,例如查看当前目录文件 cmd_process.stdin.write("dir\r\n") cmd_process.stdin.flush() time.sleep(2) # 执行完毕后可主动关闭终端窗口 cmd_process.stdin.write("exit\r\n") cmd_process.stdin.flush() cmd_process.wait()
关键注意事项
- 不要使用
start命令,也不需要加shell=True,直接启动cmd.exe才能拿到新窗口对应进程的有效输入句柄 - 每次写入命令后必须调用
flush(),否则内容会停在缓冲区无法发送给cmd执行 - 使用
\r\n作为命令结束标记,适配cmd的输入规则,兼容性优于单独的\n - 不需要配置
stdout、stderr参数,cmd的所有输出会直接展示在新开的终端窗口内,符合要求 - 如果使用的Python版本低于3.7,将
text=True替换为universal_newlines=True即可
内容的提问来源于stack exchange,提问作者AnonymCode
相关产品推荐
相关产品推荐

