在 Linux 中复制 NamedTemporaryFile 会导致文件为空
Copying a NamedTemporaryFile in Linux results in empty file
我正在 Ubuntu 16.04 下的 Python 3 中将一些内容写入 tempfile.NamedTemporaryFile
。在某些情况下,我想在写入完成后将该文件复制到其他位置。使用以下代码重现该问题:
import tempfile
import shutil
with tempfile.NamedTemporaryFile('w+t') as tmp_file:
print('Hello, world', file=tmp_file)
shutil.copy2(tmp_file.name, 'mytest.txt')
执行结束后,mytest.txt
为空。如果我在创建 NamedTemporaryFile
时使用 delete=False
我可以在 /tmp/
中检查它的内容并且它们很好。
我知道根据文档在 Windows 下打开文件时无法再次打开该文件,但 Linux 应该没问题,所以我不希望它是那样。
这是怎么回事,如何解决?
问题是 print()
调用没有被刷新,所以当复制文件时还没有写入任何内容。
使用 flush=True
作为 print()
的参数修复了问题:
import tempfile
import shutil
with tempfile.NamedTemporaryFile('w+t') as tmp_file:
print('Hello, world', file=tmp_file, flush=True)
shutil.copy2(tmp_file.name, 'mytest.txt')
我正在 Ubuntu 16.04 下的 Python 3 中将一些内容写入 tempfile.NamedTemporaryFile
。在某些情况下,我想在写入完成后将该文件复制到其他位置。使用以下代码重现该问题:
import tempfile
import shutil
with tempfile.NamedTemporaryFile('w+t') as tmp_file:
print('Hello, world', file=tmp_file)
shutil.copy2(tmp_file.name, 'mytest.txt')
执行结束后,mytest.txt
为空。如果我在创建 NamedTemporaryFile
时使用 delete=False
我可以在 /tmp/
中检查它的内容并且它们很好。
我知道根据文档在 Windows 下打开文件时无法再次打开该文件,但 Linux 应该没问题,所以我不希望它是那样。
这是怎么回事,如何解决?
问题是 print()
调用没有被刷新,所以当复制文件时还没有写入任何内容。
使用 flush=True
作为 print()
的参数修复了问题:
import tempfile
import shutil
with tempfile.NamedTemporaryFile('w+t') as tmp_file:
print('Hello, world', file=tmp_file, flush=True)
shutil.copy2(tmp_file.name, 'mytest.txt')