from tempfile import TemporaryDirectory
with TemporaryDirectory() as temp_dir:
# ... do something with temp_dir
# automatically cleaned up when context exited
from contextlib import contextmanager
import tempfile
import shutil
@contextmanager
def TemporaryDirectory():
name = tempfile.mkdtemp()
try:
yield name
finally:
shutil.rmtree(name)
正如simplylizz所指出的,如果你不介意目录已经被删除(上面的代码假设不会发生),你可以捕获“No such file or directory”异常,如下所示:
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
import tempfile
import shutil
import stat
class myTempDir(tempfile.TemporaryDirectory):
@classmethod
def _cleanup(self,name, warn_message):
for root, dirs, files in os.walk(name):
for fname in files:
full_path = os.path.join(root, fname)
os.chmod(full_path ,stat.S_IWRITE)
super()
5条答案
按热度按时间zsohkypk1#
要在Python中管理资源(比如文件),最佳实践是使用
with
关键字,它会自动释放资源(比如清理,比如关闭文件);这可以从Python 2.5中获得。从Python 3.2开始,你可以使用
tempfile.TemporaryDirectory()
来代替tempfile.mkdtmp()
--这在with
中是可用的,并且会自动清理目录:如果你使用的是Python的早期版本(至少是2.5,所以有
with
),你可以使用backports.tempfile;参见Nicholas Bishop’s answer至tempfile.TemporaryDirectory context manager in Python 2.7。滚动您自己的类(称为 * 上下文管理器)非常简单,也很有启发性。*
__enter__()
方法的返回值绑定到as
子句的目标,而__exit__()
方法在上下文退出(即使是异常)并执行清理时调用。使用
@contextlib.contextmanager
装饰器可以简化这个过程,这样就不需要手工编写上下文管理器,进入上下文时执行yield
之前的代码,生成的值绑定到as
的目标。yield
之后的代码在退出上下文时执行,这基本上是一个coroutine,封装了资源的获取和释放。yield
将控制权交给了with
子句的suite(主体)。注意,这里您 * 不 * 需要有一个try...finally
块,因为@contextlib.contextmanager
不会捕获yield
中的异常-这只是将资源管理纳入了协程。正如simplylizz所指出的,如果你不介意目录已经被删除(上面的代码假设不会发生),你可以捕获“No such file or directory”异常,如下所示:
您可以与
tempfile.py
中的标准实现进行比较;即使是这个简单的类也有缺陷,并且经过了多年的发展。有关
with
的背景信息,请参见:4ktjp1zp2#
读一下文献资料,很简单。)从文档中:该目录只能由创建用户ID读取、写入和搜索。
要删除临时目录,请尝试以下操作:
您也可以尝试tempdir软件包或查看其源代码。
0h4hbjxa3#
我在使用TemporaryDirectory()时遇到过相同/类似的问题,它基本上涵盖了您上面定义的功能。
我的问题是由于临时目录的使用,我曾经通过克隆一个git仓库来填充内容,但在这个过程中碰巧创建了一些只读文件,而在正常退出时,这些只读临时文件会导致整个临时目录停留在那里。
我确实将TemporaryDirectory继承到了我自己的类中,并且确实用下面的代码覆盖了类method _cleanup。
super()之前的代码可能会优化,但对我来说,性能不是问题。
我确实使用了原力并读取了“tempfile“的源代码
解决方案适用于Windows 10和Python 3
uajslkp64#
我认为用户有责任删除临时文件.mkdtemp()创建的临时目录及其内容。它不会像临时文件一样自动删除。有很多方法可以删除目录
如果目录为空,则可以使用
请注意,仅当目录为空时才能使用它,否则将引发
错误
这将删除整个目录路径:
小心当使用这,它将删除这整个目录和文件里面.
2vuwiymt5#
with
语句的替代语句可以是: