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

