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

如何从Python执行Shell命令并实时打印输出?

我明白你在Windows 10上用Python 3.6.2执行多条Shell命令时,没法实时看到输出的困扰——这在subprocess的默认设置下确实容易踩坑,尤其是Windows环境和Linux有不少差异。下面给你一个适配Python 3.6+ Windows环境的解决方案,能完美实现实时打印Shell输出的需求:

核心思路

用subprocess.Popen启动命令进程,通过管道逐行捕获输出,避免使用subprocess.run或check_output这类会等待命令执行完毕才返回结果的方法,同时处理Windows特有的编码问题。

完整代码示例

import subprocess

def execute_commands_with_live_output(commands):
    for cmd in commands:
        print(f"\n--- 正在执行命令: `{cmd}` ---")
        # 启动子进程,合并输出和错误流,启用行缓冲
        proc = subprocess.Popen(
            cmd,
            shell=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            bufsize=1,  # 行缓冲模式,保证输出实时刷新
            close_fds=True  # Windows下推荐设置,避免资源泄漏
        )
        
        # 逐行读取输出并打印
        # Windows CMD默认编码为cp936(GBK),如果是PowerShell则改为utf-16-le
        for line in iter(proc.stdout.readline, b''):
            try:
                output_line = line.decode('cp936').strip()
            except UnicodeDecodeError:
                # 兼容部分特殊字符场景
                output_line = line.decode('utf-8', errors='replace').strip()
            print(output_line)
        
        # 等待命令执行完成,获取返回码
        return_code = proc.wait()
        print(f"--- 命令执行结束,返回码: {return_code} ---")

# 测试用的命令列表,可以替换成你需要执行的命令
command_list = [
    "dir /s *.py",
    "echo 这是一条测试输出",
    "ping -n 4 127.0.0.1"
]

execute_commands_with_live_output(command_list)

关键细节说明

  • shell=True:在Windows下允许直接执行CMD命令(比如dir、ping这类内置命令),如果是执行外部exe可以去掉,但建议保留以兼容更多场景。
  • bufsize=1:启用行缓冲,让子进程的输出每一行都能立即被捕获并打印,而不是等待缓冲区填满才输出。
  • 编码处理:Windows CMD的默认输出编码是cp936(对应GBK编码),如果你的命令是通过PowerShell执行的,需要把解码编码改成utf-16-le,否则会出现乱码。
  • stderr=subprocess.STDOUT:把错误输出和标准输出合并,这样错误信息也能实时打印出来。

这个方案能确保每条命令执行时,输出内容实时显示在控制台,完全满足你的需求。

内容的提问来源于stack exchange,提问作者Ronan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:06:31