【发布时间】:2014-12-19 21:47:09
【问题描述】:
Best way to generate random file names in Python 的答案展示了如何在 Python 中创建临时文件。
在我的情况下,我只需要一个临时文件名。
在实际文件创建后调用tempfile.NamedTemporaryFile() 返回一个文件句柄。
有没有办法只获取文件名?我试过这个:
# Trying to get temp file path
tf = tempfile.NamedTemporaryFile()
temp_file_name = tf.name
tf.close()
# Here is my real purpose to get the temp_file_name
f = gzip.open(temp_file_name ,'wb')
...
【问题讨论】:
-
NamedTemporaryFile保证一个唯一的名称,(可能)通过尝试它并在它存在时重试。仅获得一个名称并不能保证您以后可以实际创建文件,您将面临其他使用相同名称的人的竞争条件。 -
@Joachim 没错,这里存在竞争条件,最好避免这种情况。但是,有时您必须将临时文件名传递给函数(文件打开发生在内部。)拥有一个很好的随机名称可以使竞争条件成为非问题的可能性更大。我认为有必要提供一个好的临时文件名,以尽量减少竞争条件失败的机会。当然,根据正在运行的进程和正在执行的任务添加一个好的前缀和后缀将提供更少的冲突机会。
-
@PolyMesh 您可以通过创建一个临时目录然后在其中使用固定名称文件来避免竞争条件。所以你的函数接受一个目录,而不是一个文件,并且总是创建同一个文件。
-
使用 tarfile 并将其传递给 fileobj
-
@DylanYoung:虽然很聪明,但将工作隔离到一个临时目录仍然会将您的代码暴露给竞争。即使您明确更改该目录的权限以排除竞争用户,您也可以永远排除超级用户或同一用户的竞争进程 - 当然,您只会引入更微妙的竞赛(例如,如果竞争进程创建了相同的临时目录并在您有机会之前更改了该目录的权限)。混淆临时文件名并紧紧抓住你的 GNU 手册可能更明智。