背景😧😧😧

因工作需要,要打包一些脚本使其成为exe文件,方便未安装python环境的电脑运行脚本,但是直接使用默认环境的话,会有很多的包,但是其实这个脚本根本用不到,导致生成的exe文件很大或者直接打包失败,所以创建一个虚拟环境,只安装该代码需要的模块,提高效率,减少不必要的文件内存。

方法一、anaconda 创建虚拟环境(不推荐使用)💘💘

1、打开anaconda(我使用的是python的发行版anaconda)
1、打开Anaconda Navigator,选择Environments
2、在选择Environments以后,选择create,创建
3、在弹出来的对话框中输入你要创建的虚拟环境名称,和选择创建的语言,包括python和R
4、并且可以进一步选择所创建的虚拟环境使用的python版本
5、然后点击create,环境创建完毕
6、命令行创建虚拟环境
conda create -n name python=xx(python版本)
7、退出虚拟环境
deactivate name
-8、删除虚拟环境
conda remove name --all

激活anaconda的虚拟环境

1、打开Anaconda Prompt
2、输入命令activate name(name为你需要激活的虚拟环境的名称)
3、回车执行以后,你会发现已经进入你所创建的虚拟环境

在虚拟环境中安装所需要的包

在上一步激活虚拟环境的基础上安装包
使用命令 pip install name
使用命令 conda install name

这里需要注意下:

pip与conda安装对比
1.pip安装不会安装所有的依赖项只会安装部分依赖项,而conda会安装全部;
2.pip与conda不会重复安装已经安装的依赖。
3.pip不会告诉你都安装了什么,conda会
4.pip安装的内容不会显示在anaconda navigation的环境中,conda会。
5.conda下载安装包位置xxxxx\anaconda\pkgs
6.conda list后面如果显示为说明是pip安装,不会显示在环境之中

方法二、virtualenv + virtualenvwrapper-win💗💗


这个方法真TM香,强烈推荐!!!!!

  1. 首先当然还是下载这两个模块
pip install virtualenv
pip install virtualenvwrapper-win
  1. 配置virtualenvwrapper-win,方便之后使用。
    先查看是否安装成功,当然第一次安装后不会有虚拟环境
    具体的操作指令:
    列出虚拟环境列表:workon
    新建虚拟环境:mkvirtualenv [虚拟环境名称]
    启动/切换虚拟环境:workon [虚拟环境名称]
    离开虚拟环境:deactivate
  2. python模拟命令行 python模拟运行_虚拟环境


  3. But ❗️❗️❗️ 这个不配置的话,所有创建的虚拟环境会在C盘,很烦


    看这里——————>(配置完记得重启cmd窗口)
  4. python模拟命令行 python模拟运行_virtualenv_02

  5. 然后,当然就可以用啦!不然你以为呢 😏😏😏😏😏

3、打包前的准备

  1. 需要打包的代码(一般都需要有main函数,另外最好编写log日志,方便在exe运行出错的时候检查、修改代码
  2. 代码中涉及到的数据文件
  3. 安装用于打包的模块(pyinstall)
pip install pyinstaller


但是这里需要说明的是因为前面已经配置了虚拟环境,所以上述的安装就需要在虚拟环境中去安装,这样打包出来的exe不会太大,一般也不会失败,当然在这个虚拟环境你还得安装你的代码涉及到的所有模块。

  1. 装备用于exe文件的图标(图标下载),非必须,不想设置exe文件图标可以不用。
  2. 个人配置:我一般会把整个项目新建文件存储,方便打包与后续操作。

4、打包以及参数详情、可能遇到的问题

打包成单个EXE文件


这里需要先激活之前配置的虚拟环境,这要才会使用虚拟环境。 激活方式:cmd 窗口 运行 workon [虚拟环境名称],是不是很方便?

然后进入项目目录:

(analysis) D:\WorkStation\Pycharm\analysis\PyExcel>

该目录下有*.py、data文件夹,其中data为程序使用的资源。然后新建一个buildexe目录。然后将*.py放入buildexe目录,并从网上下载一个ico格式的图标,命名为icon.ico放入该目录。最后命令行进入该目录执行命令:

(analysis) D:\WorkStation\Pycharm\analysis\PyExcel\buildexe>pyinstaller -F -w -i icon.ico *.py

等待打包完成。

其中:

  • F: 表示生成单个可执行文件
  • D: –onedir 创建一个目录,包含 exe 文件,但会依赖很多文件(默认选项)
  • w: 表示去掉控制台窗口,这在 GUI 界面时非常有用。不过如果是命令行程序的话那就把这个选项删除
  • c: –console, –nowindowed 使用控制台,无界面 (默认)
  • p: 表示你自己自定义需要加载的类路径,一般情况下用不到
  • i: 表示可执行文件的图标

打包结束后buildexe目录内会出现build和dist两个新目录和一个statistics_sales.spec文件。

其中exe文件存放在dist目录中,该exe文件即发布到其它没有python环境的系统中运行。

Tips:因为程序使用到了data文件,所以所想正常运行该exe,需要将该资源放在exe文件同目录下。

出现异常:(exe文件打包成功但没法使用的情况)


这个东西真的搞得人头大,感觉一整天啥都没干就在踩坑,从一个出来跳进另一个,因为我用画图包pyecharts了,所以是我踩的坑,希望你们不要掉下去

首先讲一下怎么调试:

找到你的exe文件,不要直接双击打开!!
因为如果遇到错误会直接闪退(加-w参数),在当前路径下打开文件夹,在cmd窗口输入.\main.exe会看到错误信息。如果到这里都一帆风顺,那么恭喜你打包已经成功。


But 头疼的就是并不会那么顺利

1.错误信息出现 UPX is not available 2.出现以下错误
FileNotFoundError: [Errno 2] No such file or directory: ‘C:\Users\a\AppData\Local\Temp\_MEI944442\pyecharts\datasets\map_filename.json’
因为我用pyecharts库,所以出这个,也许你们的是别的,方法一样,

解决方法

原因:这是因为Pyinstaller包存在的缺陷导致
方法:
在你的运行环境下找到Pyinstaller文件夹,接着在hooks文件夹下创建hook-pyecharts.py文件,在文件中写入如下代码

from PyInstaller.utils.hooks import collect_data_files,copy_metadata
datas = collect_data_files("pyecharts")+copy_metadata('prettytable')


你们的是什么就是什么不要修改成pyecharts,后面那个可以照抄 遇到其他问题可以多交流,当然我这里有啥不对的地方也可以指出,虽然我不会改,哈哈哈!!!

跟新记录:2021-04-21
一般这样打包的exe文件会很大,网上很多说用pipenv创建虚拟环境,但是我测试的时候一直没法使用 tkinter模块,所以放弃了,还是使用之前的办法,只是用会把环境中的一些不用的包删除掉,防止占用较大的空间,尤其说一下这次没用cmd 命令窗口,而是使用的Anaconda Prompt,同样的文件,第一次200M,第二次30M,感觉还行,就是每次测试哪些模块不用相对麻烦些。。。。。
😂😂😂😂😂😂😂😂😂😂😂😂

跟新:2021-05-26
 一直没啥问题,但今天出现import logging报错raise notimplementederror 'emit must be implemented ’
查找好像说是logging内置,不需要安装,我卸载了之后就ok了,但之前也没出错啊?搞不懂,记录下。

跟新:2021-07-23

之前讲的关于pyecharts的解决方案,每次记得把之前的build 和dist文件删除,再开始新的,不然每次都是已经读取的hooks,所以每次都会出错。

跟新:2022-11-10
最近重新使用pyinstaller 和pyqt5做个常用的图表显示小程序,结果打包的东西老是不能运行,各种搜索,始终不得行,最终还是觉得版本不对,换了之前使用的版本,结果就TM的好了,在此记录
pyinstaller4.8
pyqt5
5.10.1