在Python中,如何创建一个临时文件,该文件将一直保存到下一次运行?
我需要创建一个文件夹,我只使用一次,但需要有它存在,直到下次运行。看起来我应该在标准库中使用tmp_文件模块,但我不确定如何获得我想要的行为 目前,我正在执行以下操作来创建目录:在Python中,如何创建一个临时文件,该文件将一直保存到下一次运行?,python,temporary-files,Python,Temporary Files,我需要创建一个文件夹,我只使用一次,但需要有它存在,直到下次运行。看起来我应该在标准库中使用tmp_文件模块,但我不确定如何获得我想要的行为 目前,我正在执行以下操作来创建目录: randName = "temp" + str(random.randint(1000, 9999)) os.makedirs(randName) 当我想删除该目录时,我只需查找其中包含“temp”的目录。 这似乎是一个肮脏的黑客,但我不确定现在有没有更好的方法 顺便说一句,我需要文件夹的原因是我启动了一个使用文件夹
randName = "temp" + str(random.randint(1000, 9999))
os.makedirs(randName)
当我想删除该目录时,我只需查找其中包含“temp”的目录。这似乎是一个肮脏的黑客,但我不确定现在有没有更好的方法 顺便说一句,我需要文件夹的原因是我启动了一个使用文件夹的进程,其中包含以下内容:
subprocess.Popen([command], shell=True).pid
然后退出我的脚本,让另一个进程完成工作。临时文件是一个可以持续运行一个程序的文件 因此,您需要的不是临时文件 另外,要注意在一台机器上有多个用户——仅仅删除任何带有“temp”模式的内容都可能是反社会的,如果目录没有安全地放置在一边,则更是如此
另外,请记住,在某些机器上,当机器重新启动时,
/tmp
文件系统会重新生成。使用4位随机数创建文件夹是不安全的,您还需要担心与程序的其他实例发生冲突
一个更好的方法是使用创建文件夹,这正是您想要的(即,脚本退出时不会删除文件夹)。然后,您将文件夹名作为参数传递给第二个Popen'ed脚本,它将负责删除它。
tempfile
很好,但为了安全起见,您需要在下一次运行之前在某处保护目录名,例如pickle它。然后在下一次运行时读取并删除目录。您不需要为根目录设置/tmp
,tempfile.mkdtemp
有一个可选的dir
参数。不过,总的来说,它与您目前正在做的事情没有什么不同。我需要创建一个只使用一次的文件夹,但需要在下次运行之前一直存在该文件夹
“顺便说一句,我需要文件夹的原因是我启动了一个流程…”
一点也不偶然。至关重要
看起来您具有以下设计模式
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”)
- 管理资源和流程的外壳;本质上是用Python替换bash脚本
- 你的建议很危险。如果其他任何人试图创建这些目录,包括应用程序的其他实例,您可能会遇到竞争条件。此外,删除任何包含“temp”的内容可能会导致删除超出预期的内容。正如其他人所提到的,这可能是最安全的方式。下面是一个您描述的示例,包括启动子流程以使用新目录
import tempfile
import shutil
import subprocess
d = tempfile.mkdtemp(prefix='tmp')
try:
subprocess.check_call(['/bin/echo', 'Directory:', d])
finally:
shutil.rmtree(d)
创建临时文件名的最佳方法是使用tempName.temporalyFile(mode='w+b',suffix='.tmp',prifix='someRandomNumber'dir=None) 也可以使用mktemp()函数
mktemp()函数实际上不会创建任何文件,但会提供唯一的文件名(实际上不包含PID) 您还可以通过执行以下操作自动注册一个函数,以完全删除任何出口上的临时目录(无论有无错误):
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
“这看起来像是一个肮脏的黑客”?为什么?如果你用shell或其他语言来做,你也会做同样的事情。请详细说明你不喜欢这个解决方案的地方。嗯,我不确定。我想这感觉就像一个真正的蟒蛇会有一个更干净的方式来做的事情。真正让人感觉脏的部分是删除……再次——为什么?删除不再使用的文件(或目录)有什么问题。从技术上讲,该目录的“使用者”应该在完成时删除。但是清理有什么问题?是的,我想我需要一个临时的ish文件。它确实只存在一次运行,但在我的脚本结束后运行将继续。感谢分享atexit:太好了!