Python 3.10.10如何去除子进程输出中的b'、\r\n等冗余字符?
解决Python subprocess输出冗余内容的问题
问题根源
你看到的b'、\r\n、列表标识等冗余内容,是因为readlines()返回的是字节串组成的列表,直接打印会显示Python字节串和列表的原生表示,而非人类可读的纯文本。
核心解决方案
将字节串解码为字符串,拼接完整内容后输出即可。推荐用subprocess.Popen.communicate()替代逐行读取,更高效且便于处理。
修改后的完整代码
import tempfile, sys, subprocess, os # 待执行的测试代码 code = ''' print('hello) ''' # 使用NamedTemporaryFile简化临时文件管理 with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as tmp_file: tmp_file.write(code) try: # 启动子进程执行临时脚本 process = subprocess.Popen( [sys.executable, tmp_file.name], stdout=subprocess.PIPE, stderr=subprocess.PIPE ) # 等待进程结束,获取完整输出 stdout_bytes, stderr_bytes = process.communicate() # 处理错误输出 if stderr_bytes: # 解码字节串为系统默认编码的字符串,去除首尾空白 error_content = stderr_bytes.decode(sys.stdout.encoding).strip() print(error_content) else: # 处理正常输出 output_content = stdout_bytes.decode(sys.stdout.encoding).strip() print(output_content) finally: # 手动清理临时文件 os.unlink(tmp_file.name)
关键改动说明
- 改用
communicate():一次性获取进程的完整标准输出和错误输出,替代wait()+readlines()的组合,避免逐行读取的繁琐,同时确保进程正常结束。 - 字节串解码:通过
.decode(sys.stdout.encoding)将字节串转换为与系统终端编码一致的字符串,避免乱码;若明确编码为UTF-8,也可直接用.decode('utf-8')。 - 优化临时文件处理:用
NamedTemporaryFile配合with语句自动管理文件生命周期,delete=False确保子进程能访问到文件(Windows下需此设置),最后在finally块中手动删除文件。
极简修改方案(仅改输出处理)
如果不想改动临时文件部分,仅修改输出逻辑即可:
# 替换原输出处理代码 stdout_bytes = p.stdout.read() stderr_bytes = p.stderr.read() if stderr_bytes: print(stderr_bytes.decode(sys.stdout.encoding).strip()) sys.exit(0) else: print(stdout_bytes.decode(sys.stdout.encoding).strip())
内容的提问来源于stack exchange,提问作者MaxMouse
相关产品推荐
相关产品推荐

