在Python中,如何创建一个持续到下一次运行的临时文件?

时间:2009-02-24 14:03:26

标签: python temporary-files

我需要创建一个我只使用一次的文件夹,但需要在下次运行之前存在它。看起来我应该在标准库中使用tmp_file模块,但我不知道如何获得我想要的行为。

目前,我正在执行以下操作来创建目录:

randName = "temp" + str(random.randint(1000, 9999))
os.makedirs(randName)

当我想要删除目录时,我只想找到一个带有“temp”的目录 这似乎是一个肮脏的黑客,但我不确定目前更好的方式。

顺便说一句,我需要文件夹的原因是我启动了一个使用以下文件夹的进程:

subprocess.Popen([command], shell=True).pid

然后退出我的脚本让其他进程完成工作。

7 个答案:

答案 0 :(得分:16)

使用4位随机数创建文件夹是不安全的,您还需要担心与程序的其他实例发生冲突。

更好的方法是使用tempfile.mkdtemp创建文件夹,它完全符合您的要求(即当您的脚本退出时不会删除该文件夹)。然后,您将文件夹名称作为参数传递给第二个Popen'ed脚本,它将负责删除它。

答案 1 :(得分:8)

你建议的是危险的。如果其他人试图创建这些目录,您可能会遇到竞争条件 - 包括您的应用程序的其他实例。此外,删除任何包含“temp”的内容可能会导致删除超出您的意图。正如其他人所说,tempfile.mkdtemp可能是最安全的方式。以下是您所描述的示例,包括启动子进程以使用新目录。

import tempfile
import shutil
import subprocess

d = tempfile.mkdtemp(prefix='tmp')
try:
    subprocess.check_call(['/bin/echo', 'Directory:', d])
finally:
    shutil.rmtree(d)

答案 2 :(得分:4)

“我需要创建一个我只使用一次的文件夹,但需要在下次运行之前存在它。”

“顺便说一句,我需要文件夹的原因是我开始了一个过程......”

根本不是偶然的。是至关重要的。

您似乎有以下设计模式。

mkdir someDirectory
proc1 -o someDirectory # Write to the directory
proc2 -i someDirectory # Read from the directory
if [ %? == 0 ]
then
    rm someDirectory
fi

这是你在shell级写的那种东西吗?

如果是这样,请考虑将Python应用程序分成几个部分。

  • 完成实际工作的部分(“proc1”和“proc2”)

  • 管理资源和流程的Shell;本质上是bash脚本的Python替代品。

答案 3 :(得分:3)

临时文件可以用于单个程序运行。

因此,您所需要的不是临时文件。

另外,要注意一台机器上的多个用户 - 只删除带有'temp'模式的任何内容都可能是反社交的,如果目录没有安全地放在一边,那就加倍了。

另外,请记住,在某些计算机上,当计算机重新启动时会重建/tmp文件系统。

答案 4 :(得分:2)

您还可以通过执行以下操作自动注册函数以完全删除任何出口上的临时目录(有或没有错误):

import atexit
import shutil
import tempfile

# create your temporary directory
d = tempfile.mkdtemp()

# suppress it when python will be closed
atexit.register(lambda: shutil.rmtree(d))

# do your stuff...
subprocess.Popen([command], shell=True).pid

答案 5 :(得分:1)

tempfile很好,但为了安全起见,你需要在下一次运行之前保护一个目录名,例如pickle it。然后在下一次运行和删除目录中读取它。并且您不需要/tmp为根,tempfile.mkdtemp有一个可选的dir参数。但总的来说,它与你现在正在做的事情没有什么不同。

答案 6 :(得分:1)

创建临时文件名的最佳方法是使用tempName.TemporaryFile(mode ='w + b',suffix ='。tmp',prifix ='someRandomNumber'dir = None) 或者你可以使用mktemp()函数。

mktemp()函数实际上不会创建任何文件,但会提供唯一的文件名(实际上不包含PID)。