如何在Python3中同时将命令输出写入stdout和文件?附Windows命令问题
解决Windows命令输出同时写入stdout和文件的问题
你遇到的问题根源很明确:subprocess.call()返回的是命令的退出状态码,0就表示命令执行成功,所以你把这个状态码print到文件里,自然只会写入"0",而不是netsh命令的实际输出内容。
下面给你两种实用的解决方案,根据你的需求选择即可:
方案1:一次性捕获并输出(适合短输出场景)
用Python3.5+推荐的subprocess.run()来捕获命令的标准输出,然后同时打印到控制台和写入文件:
#!/usr/bin/env python3 # -*- coding:utf-8 -*- import subprocess # 执行命令并捕获输出,text=True让输出是字符串而非字节 result = subprocess.run( ['netsh', 'interface', 'show', 'interface'], capture_output=True, text=True, # 如果需要把错误输出也一起捕获,加上下面这行 # stderr=subprocess.STDOUT ) # 输出到标准输出(控制台) print(result.stdout) # 写入文件 with open('auto_change_ip.txt', 'w', encoding='utf-8') as f: f.write(result.stdout)
方案2:实时输出(适合长输出/需要实时查看内容的场景)
如果netsh命令的输出较多,或者你想一边执行一边看到输出,用subprocess.Popen()来实时读取输出流,同时完成打印和写入操作:
#!/usr/bin/env python3 # -*- coding:utf-8 -*- import subprocess with open('auto_change_ip.txt', 'w', encoding='utf-8') as f: # 启动子进程,把stdout导向管道 proc = subprocess.Popen( ['netsh', 'interface', 'show', 'interface'], stdout=subprocess.PIPE, text=True, # 同样,如果要包含错误输出,添加此行:stderr=subprocess.STDOUT ) # 逐行读取输出 for line in proc.stdout: print(line, end='') # 打印到控制台,end=''避免重复换行 f.write(line) # 写入文件 # 等待命令执行完成,获取退出码 exit_code = proc.wait() # 可根据需求处理退出码,比如非0时提示错误 if exit_code != 0: print(f"命令执行失败,退出码:{exit_code}")
两种方案都能解决你的问题,选哪种看你具体的场景需求就好~
内容的提问来源于stack exchange,提问作者Hrvoje T
相关产品推荐
相关产品推荐

