为什么 Python `NamedTemporaryFile` 不默认 `delete` 为 `False`?
Why doesn't Python `NamedTemporaryFile` default `delete` to `False`?
我试图在 Python 中使用 tempfile.NamedTemporaryFile 3. 我发现如果我想通过传递新文件名来调用使用 subprocess.call
等的任何其他进程,我不得不使用 delete = false
,然后我自己使用 os.unlink
手动删除文件。我想在允许另一个进程打开它之前我必须 close()
文件(在我的例子中,调用编译器编译从 Python 创建的源文件),显然文件在关闭时被删除.
我想知道,当 Python 已经提供 tempfile.TemporaryFile
来生成没有名称的临时文件时, 命名的 临时文件有什么用,如果不是让其他进程可以访问吗?
在我看来,默认应该是不在关闭文件时删除创建的文件,并将删除临时文件的责任推给用户,不?事实上,似乎 delete
参数本身是没有意义的,因为如果文件无论如何都会被删除,那么我们为什么需要它的名字,所以 NamedTemporaryFile
永远不应该删除...
以便您可以在with
语句中将其用作上下文管理器,并且您可以通过name
属性 获取文件名。考虑:
with tempfile.NamedTemporaryFile() as tmp_file:
subprocess.call(['foo', tmp_file.name])
do_something_with(tmp_file)
当 with
语句的主体正常或异常退出时,这将自动删除文件。
1 为什么你说你不能访问临时文件。如果您编码分叉并且文件未关闭,您仍然可以在分叉进程中访问 it.FH "are"
2 如果删除文件的责任在用户身上,那么我认为不需要这样的模块。如果我想保留文件,那么我会自己处理,但如果我只需要写入文件而不用担心它,那么我会使用 temofile 模块,该模块非常好,可以让我保留文件如果我真的需要
您必须先关闭文件才能让其他进程访问它,这是一个错误的假设。事实上,正如您所观察到的,当您对 NamedTemporaryFile 调用关闭时,默认情况下它会删除磁盘上的文件。
tempfiles
与所有 Python 一样,范围和生命周期都很重要。这是面向对象语言的一大优点,对象会在不再需要时自行清理(删除或超出范围)。销毁后,tempfile
对象会释放内存中的所有资源和磁盘上的命名文件。
因此,如果您想通过文件系统名称使用磁盘上的临时文件,NamedTemporaryFile 应该在范围内并且未关闭。不能保证在所有平台上都适用,但在 Unix/Linux 上,其他进程应该可以在文件系统中访问该文件。但是,NamedTemporaryFile 创建的文件只能由所有者读取和写入(unix 权限 0600:-rw--------)。
如果您 want/need 自己做更多的管理和清理工作,您可以考虑使用较低级别的功能 tempfile.mkstemp()
。例如,
fd, tempfilename = tempfile.mkstemp()
f = os.fdopen(fd)
在任何一种情况下,请确保在将文件名提供给另一个进程之前刷新缓冲区,file.flush()。
我试图在 Python 中使用 tempfile.NamedTemporaryFile 3. 我发现如果我想通过传递新文件名来调用使用 subprocess.call
等的任何其他进程,我不得不使用 delete = false
,然后我自己使用 os.unlink
手动删除文件。我想在允许另一个进程打开它之前我必须 close()
文件(在我的例子中,调用编译器编译从 Python 创建的源文件),显然文件在关闭时被删除.
我想知道,当 Python 已经提供 tempfile.TemporaryFile
来生成没有名称的临时文件时, 命名的 临时文件有什么用,如果不是让其他进程可以访问吗?
在我看来,默认应该是不在关闭文件时删除创建的文件,并将删除临时文件的责任推给用户,不?事实上,似乎 delete
参数本身是没有意义的,因为如果文件无论如何都会被删除,那么我们为什么需要它的名字,所以 NamedTemporaryFile
永远不应该删除...
以便您可以在with
语句中将其用作上下文管理器,并且您可以通过name
属性 获取文件名。考虑:
with tempfile.NamedTemporaryFile() as tmp_file:
subprocess.call(['foo', tmp_file.name])
do_something_with(tmp_file)
当 with
语句的主体正常或异常退出时,这将自动删除文件。
1 为什么你说你不能访问临时文件。如果您编码分叉并且文件未关闭,您仍然可以在分叉进程中访问 it.FH "are"
2 如果删除文件的责任在用户身上,那么我认为不需要这样的模块。如果我想保留文件,那么我会自己处理,但如果我只需要写入文件而不用担心它,那么我会使用 temofile 模块,该模块非常好,可以让我保留文件如果我真的需要
您必须先关闭文件才能让其他进程访问它,这是一个错误的假设。事实上,正如您所观察到的,当您对 NamedTemporaryFile 调用关闭时,默认情况下它会删除磁盘上的文件。
tempfiles
与所有 Python 一样,范围和生命周期都很重要。这是面向对象语言的一大优点,对象会在不再需要时自行清理(删除或超出范围)。销毁后,tempfile
对象会释放内存中的所有资源和磁盘上的命名文件。
因此,如果您想通过文件系统名称使用磁盘上的临时文件,NamedTemporaryFile 应该在范围内并且未关闭。不能保证在所有平台上都适用,但在 Unix/Linux 上,其他进程应该可以在文件系统中访问该文件。但是,NamedTemporaryFile 创建的文件只能由所有者读取和写入(unix 权限 0600:-rw--------)。
如果您 want/need 自己做更多的管理和清理工作,您可以考虑使用较低级别的功能 tempfile.mkstemp()
。例如,
fd, tempfilename = tempfile.mkstemp()
f = os.fdopen(fd)
在任何一种情况下,请确保在将文件名提供给另一个进程之前刷新缓冲区,file.flush()。