在 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')