在使用python开发了脚本之后,总是想要打包一下,无奈py2exe目前还是不支持python3+的版本,所以只能是使用另外两款打包软件:pyinstaller和cx_Freeze,看了一些资料,说后者的打包效果不好,于是还是使用前者进行打包:
安装pyinstaller很简单,直接使用pip安装就行了:
1 2 |
pip install pyinstaller pyinstaller --version |
可以直接看到pyinstaller的版本号:
接下来可以使用下面的两个命令进行python文件的打包:
1 2 |
pyinstaller script.py pyinstaller --onefile script.py |
前者打包完成会在dist文件夹下面生成好多的dll和相应的导入库文件,后者直接生成一个大的exe,所以一般还是选择第二个命令。在执行命令之后,pyinstaller还会在script.py文件夹下生成一个同名的script.spec文件,这个文件就是打包的配置文件,有点类似于makefile,里面很多参数可以设置。
下面进入正题:
上面的表述看上去非常简单,命令一执行就直接生成exe,这是多好的事情,但是事实就是生成的exe不能执行,最常见的错误就是:
1 |
The 'six' package is required; normally this is bundled with this package so if you get this warning, consult the packager of your distribution. |
这个问题困扰好久,谷歌上的各种方法也试过,结果解决了这个问题还有下一个XXX package is required的问题。经过一阵摸索,给出通用解决办法:
不需要对setuptools进行降级,我的计算机的配置环境是Anaconda3+python3.5+pyinstaller3.2+setuptools28.6.1。
缺什么先安装什么,上面缺少‘six’ package,则直接用下面命令进行安装:
1 |
pip install six |
安装之后从新编译生成exe,如果不提示这个包缺少则算通过。
再比如,如果出现了下面的appdirs包缺少,同样pip安装appdirs这个包,之后进行编译生成exe。
但是问题出现了,当我安装了appdirs之后,生成的exe运行的时候还是会出现上图的情况,那么就需要打开script.spec文件,找到hiddenimports=[ ]一行,在方括号中增加’appdirs’,单引号不能丢失,经过一阵试验之后,我的spec文件配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# -*- mode: python -*- block_cipher = None a = Analysis(['play.py'], pathex=['E:\\PY'], binaries=None, datas=None, hiddenimports=['appdirs','packaging.requirements'], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, name='play', debug=False, strip=False, upx=True, console=True ) |
因此总结一下pyinstaller缺少包的处理流程:
小天才!!!