Python Flask使用PyInstaller打包成单独的exe可执行文件后图片无法正常显示的问题及解决方法

在将Flask应用使用PyInstaller打包成exe可执行文件时,遇到程序运行时静态文件(如图片)无法正确加载的问题。原因是exe运行路径变为C盘的temp文件夹,而静态文件位于exe同级目录。尝试了绝对路径和BASE64编码图片的解决方案未果。最终通过在创建Flask实例时动态设置`static_folder`和`template_folder`为exe所在目录,利用os.getcwd()获取当前目录,成功解决了文件引用问题。这个经验强调了编程中深入研究和学习的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用Pyinstaller将Flask打包成单独的exe可执行文件包时,原来在Pycharm里运行正常的程序突然出了问题,就是原来正常显示的网页图片和文件全部出现URL链接错误,资源不存在或URL错误。

经过几个小时的各种网上查找资料和调试,发现了问题的根源在于运行独立的exe文件包时,Flask的默认运行路径在C盘Windows 的temp文件下,所以默认的静态文件夹static和模板文件夹templates也就引用了C盘的路径,而这时候实际的静态文件跟随exe文件包在其他文件夹,即exe文件包跟静态文件包在同一个文件夹下,但是运行解压后的Python flask程序却在C盘,系统引用的图片链接指向了C盘,所以导致图片和其他模板文件引用错误。

试了采用绝对路径引用图片方法,发现仍然出现引用错误,还想过把图片编码成BASE64格式,然后直接在浏览器里显示BASE64格式的内容,这样就不用调用图片文件,但是程序还得来一次base64编解码,会增加麻烦。

最后网上查到资料说可以更改Flask的static和templates文件夹执行路径,只要在Flask被建立时自定义static和templates文件夹即可,我使用了os库动态自动更新的方式,即通过os库取得exe主文件所在的文件夹目录,不管exe可执行文件包放在哪里,都可以随着变化。通过下列方式在创建Flask对象时指定文件夹路径:

app = Flask(__name__,static_folder= os.getcwd() + '/static',template_folder=os.getcwd() + '/templates')  # 创建Flask对象并自定义静态文件的路径,os.getcwd() 方法是获取当前exe文件包所在的父目录路径

为了解决这个问题试了各种方法、查看了很多网上资料,花了半天时间,终于解决了。从经历获得一个很大的心得就是写程序,要肯专研,善于学习别人的方法并结合自己的实践一点点的去排查。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跨境IT全栈工程师

觉得有帮助,赏点鼓励下呀

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值