You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:45:07