[Python]使用cx_Freeze打包FastApi项目的方法以及遇到的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python]使用cx_Freeze打包FastApi项目的方法以及遇到的问题相关的知识,希望对你有一定的参考价值。
参考技术A最近公司项目需要用到FastApi做一个打印web接口服务,然后将这个服务打包成Windows可执行程序,在使用pyinstaller打包出现问题之后,了解到Python官方推荐的是使用cx_Freeze打包。于是开始了cx_Freeze折腾
使用命令安装:
验证是否安装成功,打开控制台(cmd)输入:
在控制台中进入到需要打包的文件夹,执行命令:
等待打包结束,在同级目录下会出现build目录,需要的exe文件存在 build/xxx/ 中
打包过程还算简单,可以直接运行exe进行测试了
我的文件目录:
我在xxx.py文件中指定的html文件存放位置: template = Jinja2Templates(directory=".\\\\printing_server\\\\templates")
打包成exe之后运行时会默认在当前路径下面找 printing_server\\templates 文件夹,这个时候就会提示没有NotFound
所以我们可以在setup.py的incloude_files直接指定路径为 .\\\\printing_server ,生成exe之后在exe同级目录下会有 printing_server 的文件夹名称,这个时候运行exe可以正常运行。
缺点 :打包时会将printing_server中的所有内容都复制过来(包括py文件),
可能会有人有疑问,说我直接在include_files中指定文件夹到templates中不就好了吗,这个倒是解决了只导入HTML等文件,但是运行的仍然会报找不到文件的错误,因为这个时候在exe的同级目录生成的文件是templates,而我们py文件中指定的是 .\\\\printing_server\\\\templates ,所以还是找不到
针对该缺点的解决办法:将templates文件夹放在其他不包含py文件的目录,然后重新在py文件中指定存放路径,在setup.py的include_files中引入文件夹 templates (可能项目文件夹有要求,所以根据实际的来吧)。或者将exe同级目录中的静态资源文件夹中的无关资源删除
后来发现一个简单的方法,简直简单不要不要的。突然发现自己好蠢哈哈哈
由于我在xxx.py文件中指定的HTML的路径为 .\\\\printing_server\\\\templates , 我们可以在生成exe文件之后,在exe文件的同级目录中新建一个文件夹 printing_server ,然后将templates整个文件夹复制至其中,运行exe 完美!!
这个问题的原因还是因为打包成exe之后会自动在同级目录下去寻找需要的静态文件,所以只需要将py文件中指定的静态资源文件按照指定的目录存放在exe同级目录下。虽然解决办法一比较麻烦,但是还是推荐第一种方法,因为文件多了之后不用一个个的复制过去。
虽然有点啰嗦,还有些没有讲清楚!另外水平有限,还请谅解 - - -
一定记得使用相对路径呀!!
个人网站: https://www.diaoyc.cn/
以上是关于[Python]使用cx_Freeze打包FastApi项目的方法以及遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章
记录使用cx_Freeze打包Python成exe可执行程序
Python 打包工具cx_freeze 问题记录及解决办法
cx_freeze multiprocessing 打包后反复重启