想要了解更多干货,欢迎大家关注我的微信公众号:iProgram爱编程
这是第一次使用pyinstaller打包工具,花了半天时间了解了些。
首先是安装pyinstaller和pywin32
安装pywin32:
pip install pywin32
接下来是安装pyinstaller:
- 常规的安装方式
pip install PyInstaller
- 不知道什么原因我无法通过pip安装pyinstaller,只能选择第二种方式:
通过http://mirrors.aliyun.com/pypi/simple/pyinstaller/下载,之后自己解压。
解压后,在dos窗口使用
pip list
查看是否安装setuptools, 没安装的话安装一下
pip install setuptools==44.0.0
# 好像setuptools的版本也会影响后面的打包
之后在解压的pyinstaller文件夹中打开dos窗口
然后运行
python setup.py install # 安装pyinstaller
# 安装完成后
pyinstaller -v # 判断是否安装成功
pyinstaller的常见命令:
-F # 生成单个可执行文件
-D # 创建一个目录,包含exe文件,但会依赖很多文件(默认选项)
-w # 表示去掉控制台窗口
-c # 表示使用控制台
-p # 自定义需要加载的类路径
-i # 设置执行文件的图标
-w表示去掉控制台窗口,这在GUI界面时非常有用。不过如果是命令行程序的话那就把这个选项删除吧-c。但要是在不知道自己打包后的程序是否能正常运行时,先使用-c 通过控制台去看哪里出了错。
打包过程
需打包项目的目录结构
config 和 ui_package 分别存放的是配置文件和.ui文件。
第一步:此时就需要在项目入口文件所在目录打开cmd,运行
pyinstaller -D -w --clean --icon=T.ico TimeLogSystem.py
# 自己选 -F和-D二选一, -w和-c二选一
这时候已经生成了dist和build文件夹,exe文件在dist中,如果只是简单的项目这一步已经差不多了
第二步:打开生成的.spec文件
第一步生成的文件差不多就是这样, 当然-F -D -w -c 不同选项组合生成是有细微的差别的。
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['TimeLogSystem.py'],
pathex=['E:\\TimeLogSystem'],
binaries=[],
datas=[],
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,
[],
exclude_binaries=True,
name='TimeLogSystem',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False , icon='T.ico')
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='TimeLogSystem')
Analysis 的第一个参数就是你项目的入口,如果你有py文件不在项目入口所在目录下,需要自行添加,如下图(这里只是一个例子)其他我了解到的参数
第三步:修改.spec文件
由于我的项目中有配置文件和ui文件,所以我需要修改一下.spec文件和项目中对文件的引用。
项目中:
class XXX:
....
def resource_path(slef, relative_path):
if getattr(sys, 'frozen', False):
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
...
def __init__(self, ...):
...
uic.loadUi(self.resource_path(os.path.join('ui_package', 'main_window.ui')), self)
.spec文件中:
这一步很重要,因为这些静态文件在打包时并没有被打包,且在你打包后生成的exe文件运行时,会创建一个虚拟的路径去调用这些静态文件。(这里我也很晕,如果我说错了,欢迎指出。)
第四步:
删除之前生成的disc和build文件夹,再次在项目入口文件所在目录打开cmd
pyinstaller TimeLogSystem.spec
之后就好了。
顺便说一句,如果按步骤来还是不行,可能是第三步时,那些静态文件的路径除了问题,所以这里是建议在第一次打包时,可以使用-c使用控制台,看看到底出了什么问题,好百度解决。加油加油。