4

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

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

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

而当我想删除目录时,我只是寻找一个包含“temp”的目录。
这似乎是一个肮脏的黑客,但我目前不确定更好的方法。

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

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

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

4

7 回答 7

16

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

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

于 2009-02-24T14:18:50.647 回答
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)
于 2009-02-24T15:43:23.627 回答
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”)

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

于 2009-02-24T14:40:04.010 回答
3

临时文件是持续单个程序运行的东西。

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

此外,请注意单台计算机上的多个用户 - 仅删除具有“临时”模式的任何内容可能是反社会的,如果目录没有安全地放置,则更是如此。

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

于 2009-02-24T14:12:06.263 回答
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
于 2010-12-02T01:04:20.843 回答
1

tempfile很好,但是为了安全起见,您需要在某个地方保护目录名称,直到下一次运行,例如腌制它。然后在下一次运行中读取它并删除目录。并且您不需要具有/tmp根,tempfile.mkdtemp具有一个可选dir参数。不过,总的来说,它与您目前正在做的事情并没有什么不同。

于 2009-02-24T14:19:27.900 回答
1

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

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

于 2009-09-12T06:00:59.420 回答