为什么Python`NamedTemporaryFile`默认`delete`为'False`?

时间:2015-10-30 07:17:54

标签: python temporary-files

我试图在Python 3中使用tempfile.NamedTemporaryFile。我发现,如果我想通过传递新文件名来使用subprocess.call调用任何其他进程,我必须使用{{1然后使用delete = false自己手动删除文件。我假设在允许另一个进程打开它之前我必须os.unlink该文件(在我的例子中,调用编译器来编译从Python创建的源文件),显然该文件在关闭时被删除。

我想知道,当Python已经提供close()来生成没有名称的临时文件时,如果不允许其他进程访问,那么名为临时文件的用途是什么它们?

在我看来,默认应该是在文件被关闭时删除创建的文件,并将删除临时文件的责任放在用户身上,不是吗?事实上,似乎tempfile.TemporaryFile参数本身没有意义,因为如果文件无论如何都会被删除,那么为什么我们需要它的名字,所以delete永远不应该删除... < / p>

3 个答案:

答案 0 :(得分:5)

在其他进程可以访问文件之前,您必须关闭该文件是不正确的假设。实际上,正如您所观察到的,当您在NamedTemporaryFile上调用close时,默认情况下会删除磁盘上的文件。

与所有Python一样tempfiles,范围和生命周期都很重要。这是面向对象语言的伟大之处之一,当对象不再需要(删除或超出范围)时,对象会自行清理。销毁后,tempfile对象释放内存中的所有资源和磁盘上的命名文件。

因此,如果要使用文件系统名称在磁盘上使用临时文件,则NamedTemporaryFile应在范围内且未关闭。并非所有平台都能保证,但在Unix / Linux上,该文件应该可以通过其他进程在文件系统中访问。但是,NamedTemporaryFile只能由所有者创建可读写的文件(unix权限0600:-rw -------)。

如果您希望/需要自己进行更多管理和清理,可以考虑使用较低级别的功能tempfile.mkstemp()。例如,

fd, tempfilename = tempfile.mkstemp()
f = os.fdopen(fd)

在任何一种情况下,请确保在将文件名提供给另一个进程file.flush()之前刷新缓冲区。

答案 1 :(得分:4)

这样您就可以在with语句中将其用作上下文管理器,您可以通过name属性获取文件的名称。考虑:

with tempfile.NamedTemporaryFile() as tmp_file:
    subprocess.call(['foo', tmp_file.name])
    do_something_with(tmp_file)

with语句的正文正常退出或异常退出时,这将自动删除该文件。

答案 2 :(得分:0)

1是什么让你说你无法访问临时文件。如果你编码分叉并且文件没有关闭,你仍然可以访问它.FH“是”在分叉的过程中

2如果删除文件的责任在用户身上,那么我认为不需要像这样的模块。如果我想保留文件,那么我将自己处理它,但如果我只需要写一个文件而不用担心它,那么我使用temofile模块,模块非常好,它允许我保留文件如果我真的需要