[Python]使用cx_Freeze打包FastApi项目的方法以及遇到的问题

前言

最近公司项目需要用到FastApi做一个打印web接口服务,然后将这个服务打包成Windows可执行程序,在使用pyinstaller打包出现问题之后,了解到Python官方推荐的是使用cx_Freeze打包。于是开始了cx_Freeze折腾

安装

使用命令安装:

pip install cx_Freeze

验证是否安装成功,打开控制台(cmd)输入:

cxfreeze -h

# 如果有类似提示则表示安装成功:Usage: cxfreeze [options] [SCRIPT]

打包exe

简单的使用

在控制台中进入到需要打包的文件夹,执行命令:

cxfreeze run.py --target-dir=build
  • run.py 表示打包的文件名称,一般为程序的入口文件
  • --target-dir=build 表示打包后的文件存放路径
    执行完成之后可以在同路径下的build/xxx/文件夹中找到刚刚打包的run.exe
    如果存在需要引入的某些三方库,用这种方法可能找不到,所以不推荐这种方法

使用setup.py进行打包

  1. 在需要打包的路径下新建一个setup.py(名字随意,你喜欢就好),输入以下内容
import sys
from cx_Freeze import setup, Executable

include_files = ['.\\printing_server\\templates\\log_websocket_client.html']

build_exe_options = {'packages': ['uvicorn','ipaddress','jinja2.ext'], 
                     'excludes': [],
                     'include_files':include_files
                     }
base = None
if sys.platform == 'win32':
  base = 'Win32GUI'

setup(  name = 'runFastApi',
        version = '0.1',
        description = '打印服务',
        options = {'build_exe': build_exe_options},
        executables = [Executable('run.py')])
  • include_files 需要引入的静态文件、动态链接库等等内容
  • packages 需要引入的三方扩展包,虽然可以自动根据py文件引入三方库进入导入,但是避免不了有些库,它无法识别,所以需要手动显性的引入
  • setup name表示文件名称,version,exe描述,options 打包时需要引入的文件或者三方库包,executables 设置程序的入口文件
  1. 然后在终端中执行命令:
python setup.py build

等待打包结束,在同级目录下会出现build目录,需要的exe文件存在build/xxx/
打包过程还算简单,可以直接运行exe进行测试了

遇到的问题

  1. 打包完成之后,直接双击会闪退,在cmd中运行exe提示ModuleNotFoundError: No module named 'xxx' 这个时候就需要在setup.py 文件中的packages文件中加入需要的扩展包
  2. 由于是web服务打包成了exe,其中不免会包含HTML等文件,打包的时候可以在include_files中指定文件路径。指定了路径之后cx_freeze会自动将文件复制到生成的可执行文件的同级目录下,这个时候仍然可能会出现提示找不到html等文件。

解决办法一:

我的文件目录:

printing_server
  |_templates(存放的是HTML文件)
  |_xxx.py
run.py
setup.py

我在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/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351