将编写的Python文档打包为exe格式文件
1.安装pyinstaller和pywin32包文件
2.创建启动文件
pyi-makespec ascm_tools.spec
启动文件示例:
# -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis(['ascm_tools.py'], pathex=['D:\\mydata\\Development\\Python\\MyProjects\\ascm_gov'], binaries=[], datas=[('images\\logo.png','images\\logo.png')], hiddenimports=['queue'], 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='ascm_tools', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=False,icon='favicon.ico' )
3.用pyinstaller命令打包
命令格式:
pyinstaller [项目启动文件]
其他参数(按需求选择):
- -F 表示在 dist 文件夹下只生成单个可执行文件(内部包含所有依赖),不加默认会在 dist 生成一大堆依赖文件+可执行文件。
- -D 与 -F 相反用法
- -W 表示去掉控制台窗口,如果你的程序是有界面的,可以不写这个参数。但是测试情况下建议先加上这个参数,因为如果打包不成功,运行时报错信息会在控制台上输出,没有控制台就看不到报错信息。
- -c 表示去掉窗框,使用控制台
- -p 表示自己定义需要加载的类路径,项目中包含多个自建模块的时候需要加上 -p aaa.py -p bbb.py -p ccc.py
- -i 表示可执行文件的图标,后面跟图标的路径
- –hidden-import 后面跟模块名如 queue,用于告诉打包程序某个模块我用不着你不用打包进去
打包完毕后在 dist 文件夹下双击项目启动文件就可以了
示例:
pyinstaller -F -w ascm_tools.spec 有时候加了-w打包后还是有黑屏,可以尝试如下命令: pyinstaller -F -w -i favicon.ico 24h_Schedule.py --noconsole
pyinstaller报错解决
1.执行打包命令时报错 IndexError: tuple index out of range
- 原因:官网目前的版本是 3.2.1 只支持到 python3.5 ,高版本的 python 尚不支持,
- 解决方法:网上有大神提供了完善版的代码——官网源码里有 https://github.com/pyinstaller/pyinstaller 替换你 python 目录下的 \Lib\site-packages\PyInstaller 即可 这样就支持python3.6了 不过是开发版,可能还不完善。
作者建议最好还是用虚拟环境下的 python3.5 进行打包。
2.执行打包命令时报错 ImportError: No module named ‘queue’
- 原因:尚不清楚
- 解决方法:如果该模块你用不到,可以在执行打包命令时用 –hidden-import 不打包进去。如果程序中需要该模块,在主文件最上面写上 improt queue
3.打包命令执行成功,但双击可执行程序弹出报错窗口failed to excute script xxx
- 原因:打包时内部缺少了某个依赖,这时需要看看控制台打印了什么报错信息,打包时加了 -w 参数的请再打包一次记得去掉 -w
- 现象:基本都是在控制台上发现报错 No module named ‘xxxxx’,如 No module named ‘queue’ 或者 ModuleNotFoundError: No module named ‘PyQt5.sip’
- 解决方法:同2,如果该模块你用不到,可以在执行打包命令时用 –hidden-import 不打包进去。如果程序中需要该模块,在主文件最上面写上 improt xxxxx。如 import queue 或 import PyQt5.sip
评论前必须登录!
注册