原本在写的一个运行得好好的小工具里,我把临时存储文件的方法改为了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来创建临时文件、文件夹,不过需要手动清理