关于tempfile自动销毁文件/文件夹带来的思考
原本在写的一个运行得好好的小工具里,我把临时存储文件的方法改为了python提供的tempfile,以此避免忘记释放临时文件、文件夹。
但是引入后却发现了程序不能正常运行,出现类似下面的提示:
FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\LONELY~1\AppData\Local\Temp\tmp9zzu9xai/abc.png'
但是在引入前,在Python控制台测试过是可以正常读取,直到Python.exe关闭才自动删除文件夹
控制台代码是这样的:
from tempfile import TemporaryDirectory
temp_dir = TemporaryDirectory()
temp_dir.name
在项目内引入后的代码是这样的(精简后):
class qr_code_main(QFrame, Ui_Qr_Form):
def __init__(self):
super().__init__()
tempfolder = TemporaryDirectory()
self.dirname = tempfolder.name
print('dirname is:', self.dirname)
def save(self):
img = qr.make_image(省略)
img.save(f"{self.dirname}/abc.png")
这里的img.save()方法报错
FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\LONELY~1\AppData\Local\Temp\tmp9zzu9xai/abc.png'
查看了本地的目录,确实没有tmp9zzu9xai这个临时目录。
翻阅了python的官网文档,文档说明tempfile“生成的对象可以用作上下文管理器。完成文件对象的上下文或销毁后,临时文件将从文件系统中删除。”
但我不是很明白这个上下文,不太知道销毁的节点,于是做了几个测试,
1、以.py文件形式写代码,创建临时文件夹,后关闭程序:
from tempfile import TemporaryDirectory
temp_dir = TemporaryDirectory()
temp_dir.name
运行完自动删除临时文件夹
2、以.py文件形式写代码,创建临时文件并让等待5秒后关闭程序:
from tempfile import TemporaryDirectory
temp_dir = TemporaryDirectory()
temp_dir.name
time.sleep(5)
创建完临时文件夹等待5秒后自动删除临时文件夹
3、以.py文件形式写代码,以方法的形式写代码:
def fun2():
print("into fun2")
time.sleep(3)
def fun1():
tmpdir = TemporaryDirectory()
print('created temporary directory', tmpdir.name)
time.sleep(5)
fun2()
fun1()
在执行完fun1,临时文件夹就被销毁了
4、以.py文件形式写代码,以方法的形式写代码2:
def fun3(crt):
print("into fun3")
time.sleep(5)
print(tmpdir)
def fun2():
print("into fun2")
time.sleep(3)
def fun1():
tmpdir = TemporaryDirectory()
print('created temporary directory', tmpdir.name)
time.sleep(5)
return fun3(tmpdir)
fun2()
fun1()
直到fun3执行完毕后,临时文件夹才销毁
5、在Python控制台以方法的形式去写:
def fun1():
tmpdir = TemporaryDirectory()
print('created temporary directory', tmpdir.name)
time.sleep(5)
fun1()
执行完自动销毁临时文件夹
所以最开始在Python控制台测试的代码为什么不会自动销毁文件夹,原因就出在Python控制台输入的代码,可以理解存放在一个临时的py文件里,而只要一直开着控制台,这个程序不会结束,相当于写代码时写入等待时间一样:
from tempfile import TemporaryDirectory
temp_dir = TemporaryDirectory()
temp_dir.name
time.sleep(999)
Python官方说明里提到使用with来搭配使用(https://docs.python.org/zh-cn/3.6/library/tempfile.html),而也可以使用更安全的msktemp、msdtemp来创建临时文件、文件夹,不过需要手动清理
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭