我正在为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在执行结束后为空。如果我在创建delete=False时使用NamedTemporaryFile,我可以在/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')

09-04 16:56