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

StackOverflow https://stackoverflow.com/questions/581851

  •  06-09-2019
  •  | 
  •  

我需要创建一个仅使用一次的文件夹,但需要让它存在直到下次运行。看来我应该使用标准库中的 tmp_file 模块,但我不确定如何获得我想要的行为。

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

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

当我想删除该目录时,我只需查找其中包含“temp”的目录即可。
这看起来像是一个肮脏的黑客,但我目前不确定更好的方法。

顺便说一句,我需要该文件夹的原因是我启动了一个使用该文件夹的进程,其中包含以下内容:

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

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

有帮助吗?

解决方案

有一个4位数的随机数,创建文件夹是不安全的,你还需要担心与程序的其他情况下的碰撞。

有一个更好的方法是使用 tempfile.mkdtemp 创建文件夹,这究竟是干什么的你想要的(即当你的脚本退出不会被删除的文件夹)。然后,将通过文件夹名称到第二Popen'ed脚本作为参数,并且这将是负责删除它。

其他提示

您已经表明什么是危险的。您可能有竞争条件,如果其他人试图创建这些目录 - 包括你的应用程序的其他实例。此外,删除包含任何“临时”可能会导致删除超过您的预期。正如其他人所说, 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)

“我需要创建一个仅使用一次的文件夹,但需要让它存在直到下次运行。”

“顺便说一句,我需要该文件夹的原因是我启动了一个进程......”

绝不是偶然的。至关重要的。

您似乎有以下设计模式。

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 替代品。

一个临时文件是什么,持续单个程序运行。

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

此外,一台机器上要注意多用户的 - 只是删除任何与“温度”的格局可能是反社会的,加倍所以如果目录不在安全的方式进行。

此外,请记住在某些机器中,/tmp文件系统被重建时,机器重新启动。

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

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

tempfile是蛮好的,但要在安全方面你需要安全的目录名,直到下一次运行的地方,例如腌制的。那么在接下来的运行阅读和删除目录。你不需要有/tmp根,tempfile.mkdtemp具有该可选dir参数。总的来说,虽然,它不会从你此刻在做什么不同的。

创建临时文件名的最好的方法是使用任一tempName.TemporaryFile(模式= 'W + B',后缀= 'TMP',prifix = 'someRandomNumber' DIR =无) 或u可以使用mktemp的()函数。

在mktemp的()函数实际上不会产生任何文件,但将提供一个唯一的文件名(实际上不包含PID)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top