最近有个项目是用Python做的,在交付的时候需要进行打包,从网上找了很久,发现虽然资料很多,但是真正能解决我现在的问题的不多。
这里我就讲下我是怎样打包含有动态加载的项目吧。
【背景介绍】:
当前程序主程序是Main.py文件,其他sConfig.py都是辅助于Main.py的,其中Filature比较特殊,正常代码是不会加载,只有在平台跑起来之后,才会加载Filature里面的*.py文件。按照网上的方法打包,没有一个成功的,每次到加载Filature里面的文件就提示报错。在网上找了很多资料,基本没有一篇文章有讲到类似的场景的。
【打包步骤】
1.安装pyinstaller(Python版本为3.6以后版本)
pip3 install pyinstaller # 注意Python3最好写pip3,如果电脑里有多个python版本,pip可能指向的不一定是python3
安装的地方不多介绍,出坑的可能性不大。
2.继续打开Windows的命令行窗口,切换到需要打包的程序的目录
cd C:\Users\\2501000520\Desktop\Kid\\Engine\
# 用命令行切换到需要打包的程序的目录,可以直接进行复制。
3. pyinstaller -F xxx.py(xxx.py,打包的文件)
分水岭(以上步骤,基本大多数的文章都是这么写的,但是针对动态加载的程序,就不能单纯的用上面的指令)
3.1 通过使用命令pyi-makespec -w xxx.py能够生成相应的xxx.spec文件
因为此处我们需要用到一些动态加载的东西,直接打包,并不会包含一些config的内容。
此处我们需要详细的阅读下.spec文件
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
SETUP_DIR = 'C:\\Users\\2501000520\\Desktop\\Kid\\Engine\\'
# 此处定义了需要打包的文件的路径地址,因为后面多处会用到,这里先定义个变量
a = Analysis(['Main.py'],
pathex=['C:\\Users\\2501000520\\Desktop\\Kid\\Engine'],
binaries=[],
datas=[(SETUP_DIR+'Config', 'Config'), (SETUP_DIR+'Filature', 'Filature')],
# 默认此处为空,我们需要加上我们需要额外加载的文件,比如config
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='Main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True ) # EXE表示执行相关,console表示是否需要显示窗口
按照如上设置,讲需要动态加载进来的文件,比如config,比如filature,添加到datas里面。
可修改的位置:
- 添加py_files列表,包含项目需要的所有python脚本
- 添加add_files列表,包含涉及到的所有资源文件,每个文件是2元组的形式存放
- name='Main', 制定可执行程序名字
- console=False, 制定可执行程序执行时不显示控制台窗口
- icon='', 设置程序图标,ico格式文件(16*16)
3.2 将修改后的.spec文件保存
3.3 执行setup.spec
文件。项目路径下输入指令:pyinstaller -F main.spec
3.4 在根目录下找到dist目录,然后将需要动态加载的内容复制到Main.exe同目录(不修改.spec文件默认的时候是不会搜索根目录下的其他文件的)
3.5 运行Main.exe
3.6 打包完成
补充:
需要查看pyinstaller有哪些指令的可以参考以下文章: