如何在Python中将命令输出追加到临时文件?求助解决报错
问题分析与修复
错误原因
你的代码存在两个核心问题:
- 文件名使用错误:
os.system里的"temp1"是字符串字面量,并非临时文件的实际路径,导致命令输出写入了一个名为temp1的普通文件,而非你创建的临时文件。 - 参数类型错误:
temp1是_TemporaryFileWrapper对象,不是字符串路径,而open()函数需要接收路径字符串,因此抛出类型错误。
修复后的代码
import tempfile import os # 创建临时文件,指定文本模式方便读写 temp1 = tempfile.NamedTemporaryFile(mode='w+', encoding='utf-8') # 使用临时文件的实际路径执行追加命令(tee -a 实现追加) os.system(f"echo Hello world | tee -a {temp1.name}") # 将文件指针移到开头,以便读取刚写入的内容 temp1.seek(0) # 读取最后一行 a = temp1.readlines()[-1] print(a) # 手动关闭文件(可选,程序结束时会自动关闭并删除) temp1.close()
关键说明
- 获取临时文件路径:通过
temp1.name获取临时文件的实际系统路径,确保命令输出写入正确的文件。 - 复用已打开的文件对象:
NamedTemporaryFile创建的文件已经处于打开状态,无需再用open()重新打开,直接使用temp1对象操作即可。 - 调整文件指针位置:外部命令写入文件后,Python 中的文件指针会停留在文件末尾,需要用
seek(0)将指针移到开头才能读取内容。 - 追加内容设置:使用
tee -a替代tee,实现向临时文件追加内容而非覆盖原有内容,符合你的需求。 - 文本模式配置:添加
mode='w+'和encoding='utf-8'让文件以文本模式操作,避免二进制读写的编码问题。
更优雅的替代方案(使用 subprocess)
os.system 无法直接捕获输出,推荐使用 subprocess 模块,更符合 Python 风格:
import tempfile import subprocess with tempfile.NamedTemporaryFile(mode='w+', encoding='utf-8', delete=False) as temp1: # 执行命令并将输出追加到临时文件 subprocess.run(["echo", "Hello world"], stdout=temp1) # 移回文件开头 temp1.seek(0) # 读取最后一行 a = temp1.readlines()[-1] print(a) # 手动删除临时文件(因为设置了 delete=False) os.unlink(temp1.name)
内容的提问来源于stack exchange,提问作者lilly m
相关产品推荐
相关产品推荐

