如何删除由python tempfile.mkdtemp创build的目录

我有一个python程序使用tempfile.mkdtemp在/ temp下创buildtmp目录。
不幸的是,python程序在使用后没有删除目录。 所以现在磁盘空间不足。

问题:

  1. 如何手动删除/ temp下的临时目录? 我试图手动删除它们,但得到“权限被拒绝”的错误。
  2. 在python程序中,如何在使用它们之后删除临时目录。

Solutions Collecting From Web of "如何删除由python tempfile.mkdtemp创build的目录"

要在Python中管理资源(如文件),最好的做法是使用with关键字,它会自动释放资源(即清理,就像关闭文件)。 这可以从Python 2.5中获得。

从Python 3.2开始,您可以使用tempfile.TemporaryDirectory()而不是tempfile.mkdtmp() – 这可用于并自动清理目录:

 from tempfile import TemporaryDirectory with TemporaryDirectory() as temp_dir: # ... do something with temp_dir # automatically cleaned up when context exited 

如果您使用的是较早版本的Python(至少2.5,那么可以),您可以使用backports.tempfile ; 请参阅Nicholas Bishop 在Python 2.7中对tempfile.TemporaryDirectory上下文管理器 的回答 。

推出自己的课程简单而有益,被称为上下文管理器 。 __exit__()方法的返回值绑定到as子句的目标,而__exit__()方法在退出上下文时调用 – 即使是异常 – 也会执行清理。

 import shutil import tempfile class TemporaryDirectory(object): """Context manager for tempfile.mkdtemp() so it's usable with "with" statement.""" def __enter__(self): self.name = tempfile.mkdtemp() return self.name def __exit__(self, exc_type, exc_value, traceback): shutil.rmtree(self.name) 

你可以用@contextlib.contextmanager装饰器简化它,所以你不需要手动编写上下文管理器。 在进入上下文时, yield之前的代码被执行, yield的值被绑定到as的目标,退出上下文之后执行yield之后的代码。 这从根本上说是一个封装了资源获取和释放的协同程序 ,并且对with条款的套件 (主体)产生了良好的控制。 请注意,在这里您需要try...finally块,因为@contextlib.contextmanager不会捕获yield异常 – 这只是将资源管理纳入协程。

 from contextlib import contextmanager import tempfile import shutil @contextmanager def TemporaryDirectory(): name = tempfile.mkdtemp() try: yield name finally: shutil.rmtree(name) 

正如simplylizz所指出的那样,如果您不介意已经被删除的目录(上面的代码假设不会发生),您可以捕获“没有这样的文件或目录”异常,如下所示:

 import errno # ... try: shutil.rmtree(self.name) except OSError as e: # Reraise unless ENOENT: No such file or directory # (ok if directory has already been deleted) if e.errno != errno.ENOENT: raise 

你可以比较tempfile.py的标准实现; 即使这个简单的课程也有错误,多年来不断演变。

有关背景的信息,请参阅:

  • Python教程: 文件对象的方法
  • 与语句上下文管理器
  • PEP 343 – “与”声明

阅读文档 ,很简单。 ;)从文档:该目录是可读,可写,只能通过创建用户ID搜索。

要删除临时目录,请尝试如下所示:

 import errno import shutil import tempfile try: tmp_dir = tempfile.mkdtemp() # create dir # ... do something finally: try: shutil.rmtree(tmp_dir) # delete directory except OSError as exc: if exc.errno != errno.ENOENT: # ENOENT - no such file or directory raise # re-raise exception 

你也可以尝试tempdir包或查看它的来源。