在使用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文件包所在的父目录路径

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