Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,如何创建一个临时文件,该文件将一直保存到下一次运行?_Python_Temporary Files - Fatal编程技术网

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

在Python中,如何创建一个临时文件,该文件将一直保存到下一次运行?,python,temporary-files,Python,Temporary Files,我需要创建一个文件夹,我只使用一次,但需要有它存在,直到下次运行。看起来我应该在标准库中使用tmp_文件模块,但我不确定如何获得我想要的行为 目前,我正在执行以下操作来创建目录: randName = "temp" + str(random.randint(1000, 9999)) os.makedirs(randName) 当我想删除该目录时,我只需查找其中包含“temp”的目录。 这似乎是一个肮脏的黑客,但我不确定现在有没有更好的方法 顺便说一句,我需要文件夹的原因是我启动了一个使用文件夹

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

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

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:太好了!