1. 打包exe文件
1)安装pyinstaller
打包成exe文件需要使用pyinstaller模块,可通过pip安装
pip install pyinstaller
2)打包
常用参数(重点为加粗的参数):
-F 制作独立的可执行程序(即生成单一的可执行文件,而不是多个)
-p 添加搜索路径,以便找到依赖文件(import引入的文件,注意不是模块,默认会在当前 目录查找)
-w 制作窗口程序(制作带界面的程序时,不加该参数,运行时会弹出黑框)
-c 制作命令行程序(默认)
--icon=[ico文件路径] 指定程序图标(也可以使用-i 图片名.ico)
-v [指定文件] 指定程序版本信息
-n [指定程序名] 指定程序名称(不指定则为源文件的名称)
-D 制作出的档案存放在同一个文件夹下(默认值)
-K 包含TCL/TK(对于使用了TK的,最好加上这个选项,否则在未安装TK的电脑上无法运行)
-X 制作使用UPX压缩过的可执行程序(推荐使用这个选项,需要下载UPX包,解压后upx.exe 放在Python(非PyInstaller)安装目录下,下载upx308w.zip)
-o DIR 指定输出SPEC文件路径(这也决定了最后输出的exe文件路径)
ps:
打包完成后会生成两个目录,dist和build,生成的exe文件位于dist目录,build目录没用可删除
制作ico图标的链接 在线生成透明ICO图标——ICO图标制作 ,下载ico图标的链接: https://www.easyicon.net/
3)示例
①制作不带图标的,非窗口程序
②制作带图标的,非窗口程序
pyinstaller -F -i favicon.ico ControlAccess.py
③制作带图标的窗口程序
pyinstaller -F -w -i favicon.ico ControlAccess.p
注意:生成的带图标的exe文件,需要离开当前目录才会显示图标
2. 常见问题
1) 提示缺少numpy.random.common
用pyinstaller打包时出错:
failed to execute script 文件名
错误提示:
no module named 'numpy.random.common'
解决方法:
该问题是由于numpy版本导致,降低版本后问题解决:
pip uninstall numpy
pip install numpy==1.16.2 //安装指定版本numpy模块
2) unknown encoding: idna
解决方法,在代码开头导入:
import encodings.idna
注:只在被打包的py文件中导入idna即可,其引用的其他文件无需关心
3) 正常打包,但exe程序执行时报FileNotFoundError
报错如下,以 _cffi_backend为例:
FileNotFoundError:[Errno 2] No such file or dirctory:'xx:\\anaconda3\\lib\\site-packages\\_cffi_backend.pyd'
原因是打包的时候这个包没有被隐式打包进去
解决方法:打包时添加如下--hidden-import参数,值为缺少的包的名称。
pyinstaller -F --hidden-import=_cffi_backend test.py
4) 多进程代码重复启动
将包含多进程的代码打包为exe时,程序重复执行,直至内存耗尽。这是fork()在windows上的缺点。解决办法是在main()最前面执行freeze_support()
from multiprocessing import freeze_support
if __name__ == "__main__":
freeze_support()
# 之后再执行多进程