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 test.py


②制作带图标的,非窗口程序




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


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()
    # 之后再执行多进程