本文实例:打包发布带窗口的python程序(程序中导入的库 有:random, base64, re, time, threading, tkinter, PIL)
使用anaconda虚拟环境打包python程序发布exe,可以使程序仅打包xx.py文件中导入的库,以控制exe程序的大小;相对于使用原有环境发布,可以大幅缩小exe文件大小。
从系统home菜单中找到Anaconda,打开Anaconda命令行窗口(Anaconda Prompt)
一、检查更新conda
$ conda -V
二、创建虚拟环境并激活
$ conda create -n [环境名] python=x.x
创建python版本为3.7,名字为test1的虚拟环境。创建的虚拟环境以文件夹的形式存在,默认在Anaconda安装目录下的envs文件夹中。
创建过程中系统会将虚拟环境的python版本、默认安装库信息列出,让确定是否继续进行,输入y后继续;
创建完成后(此时可以在envs文件夹下看到test1文件夹),系统提示:
激活该环境命令为:$ conda activate test1
关闭该环境命令为:$ conda deactivate
激活环境test1:
三、安装所发布python程序中需要的库,以及打包程序需要使用的pyinstaller库
这里使用 $ pip install [库名] 命令安装库(环境创建时默认安装包中包含pip,可以直接使用)
进入环境文件夹:
$ cd [环境文件夹路径]
(我的Anaconda安装在c盘的swinstall下,所以命令为$ cd C:\swinstall\Anaconda\envs\test1,请根据实际确定路径)
安装python程序用到的库以及pyinstaller库(注:可以使用$conda list 命令查看环境中已经存在库的列表,仅需要安装不在默认库列表中的库,如无法确认是否为默认库,建议对程序中所有库执行一次$pip install [库名] 命令)
我的程序中用到了random库,进行安装时提示Error,而random库非特殊库,这时基本确定random库是默认库,已经包含在了环境中;(re, time, threading, base64, tkinter 库进行安装时出现了同样的Error,暂且认为其均为默认库,已经包含在了环境中)
继续安装其它库:
$ pip install pillow
最后,不要忘记安装打包程序需要的pyinstaller库
$ pip install pyinstaller
四、进入python程序所在文件夹,执行打包命令$ pyinstall -F [-option] xx.py
由于我的程序代码是在D盘,所以先从C盘切换到D盘,再进入文件夹
$ D:
$ cd D:\WorkandFuture\spiderpython\randsel
我的打包命令为:
$ pyinstaller -F -w randselname.py
(-F为输出可执行文件,-w是程序执行时不输出黑窗口,具体细节请查阅pyinstaller相关文档)
命令执行结束,提示 successfully 即打包成功;打包时生成的文件在xx.py所在文件夹下,其中可执行文件xx.exe在生成的dist文件夹中。
运行xx.exe,测试成功,即可确认前期库安装没有问题。
最后,关闭虚拟环境。
$ conda deactivate
于20240426增加:
因:将htm格式表格转换为xlsx程序发布时:①在非虚拟环境中程序运行正常,②虚拟环境仅对pandas、pyinstaller进行安装,③发布时因需要输入而使用 pyinstaller -F xx.py;exe成功生成但运行时闪退;
后以pyinstaller -F -w xx.py发布,程序提示缺少包,添加后重新发布,运行正常。
故:因包依赖的原因,仅安装pandas等可见包是不够的,应可能考虑到包依赖;
解决:①无论是否需要黑窗口,都先以无窗口模式发布,运行以发现所缺少的包;
②尝试将编辑器环境修改为虚拟环境,运行.py以发现所缺少的包。