如何从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
相关产品推荐
相关产品推荐

