pyinstaller的介绍及使用
参考https://zhuanlan.zhihu.com/p/470301078。
我项目中对pyinstaller的使用主要是两步:
生成spec文件
pyi-makespec -w gui.py
编辑spec文件,然后生成exe可执行文件。
pyinstaller gui.spec
pyinstaller中spec文件介绍
参考:Pyinstaller的Spec文件用法
https://blog.csdn.net/tangfreeze/article/details/112240342
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['main.py'],#这里是项目的入口程序
pathex=['E:\Folder\python\chaoxing-main\chaoxing-main'], #此列表为项目路径
binaries=[],
datas=[( , ),( , )], #此处填写非py文件,多个文件用(),[('源文件路径','目标路径')]
hiddenimports=[],#这里写其他依赖的项目,比如
hookspath=[],
hooksconfig={},
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='main', #程序exe的名称
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True, # 打包的时候进行压缩,False表示不压缩
console=True, #此处console=True表示,打包后的可执行文件双击运行时屏幕会出现一个cmd窗口,不影响原程序运行,如不需要执行窗口,改成False即可
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon='icon.ico', #程序图标,要绝对路径
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='main', #程序文件夹名称
)
遇到的问题及解决
Python进程池pool与pyinstaller打包exe程序运行进入死循环。
描述
我在主程序调用的子程序中使用了多进程,然后在idea中运行没问题,但是打包成exe后,运行就会不停的重新打开gui页面。
原因
(1)、因为开启子进程是不支持打包exe文件的,所以会不停向操作系统申请创建子进程,
而这个代码 multiprocessing.freeze_support() 作用就是支持打包到Windows的EXE文件。
(2)、多进程的程序运行后,如果直接关闭控制台窗口,那么整个程序都会退出。
如果是 进入 任务管理器,单独结束 控制窗口 的进程,如果子进程不是守护进程,那么子进程还是会继续运行。
(3)、如果是多线程的,则没这个问题,可以直接打包。
解决
在if __name__ == '__main__': 中加入:multiprocessing.freeze_support()
其它
但有个小提示, 如果是 tkinter 的图形界面运行的,是多线程的话,如果子线程不是守护线程,那么关掉主界面后,子线程会继续运行。
如果也是控制台窗口的话,效果和上面 2 提到的进程效果一样。