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

Python调用subprocess读取NamedTemporaryFile返回空问题咨询

问题原因

你遇到的问题和tempfile.NamedTemporaryFile的声明无关,是文件I/O缓冲区未刷新导致的:

  • 你调用tmp.write()写入内容后,内容默认会先留在进程的内存缓冲区里,并没有立刻写入磁盘
  • 此时直接启动subprocess读取文件,读到的是还没有刷入磁盘的空文件
  • 脚本运行结束后Python会自动关闭所有打开的文件句柄,关闭操作会自动把缓冲区内容刷入磁盘,所以你事后查看文件时内容是完整的
修复方案

有两种常用的修复方式:

方式1:写入完成后主动关闭临时文件句柄

写入完成后调用tmp.close(),关闭操作会自动触发缓冲区刷新,把内容写入磁盘后再调用subprocess读取即可:

#!/usr/bin/python3
  
import subprocess
import tempfile

tmp = tempfile.NamedTemporaryFile(delete=False)
tmp.write(bytes("testcontent", encoding = 'utf-8'))
tmp.close() # 新增关闭句柄的逻辑
tmp_path = tmp.name
output = subprocess.run('cat ' + tmp_path, shell=True, capture_output=True)
print(tmp.name)
print(output.stdout)

方式2:写入完成后主动调用flush方法刷入磁盘

如果后续还需要在当前进程操作这个文件句柄,不想提前关闭,可以调用tmp.flush()主动把缓冲区内容刷入磁盘:

#!/usr/bin/python3
  
import subprocess
import tempfile

tmp = tempfile.NamedTemporaryFile(delete=False)
tmp.write(bytes("testcontent", encoding = 'utf-8'))
tmp.flush() # 新增主动刷新缓冲区的逻辑
tmp_path = tmp.name
output = subprocess.run('cat ' + tmp_path, shell=True, capture_output=True)
print(tmp.name)
print(output.stdout)
# 后续还可以继续操作tmp句柄
额外说明

你手动提前创建的文件读取正常,是因为你手动写入后就关闭了文件,内容已经完全写入磁盘,所以subprocess可以正常读到内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:36:00