因为最近一直在用pyqt5做开发,最后要打包成一个exe,但为了可以调用32位的dll做二次开发(和之前开发LED的文章关联),我在anconda里面装了一个python32环境,但是却在用pyinstaller打包时候发现找不到dll库,特记录下来,也希望能帮助到其他人。
- 1.安装pyinstaller
-
pip install pyinstaller
- 2.参考(直接看3干货):
-
pyinstaller [主文件] -p [其他文件1] -p [其他文件2] --hidden-import [自建模块1] --hidden-import [自建模块2]
pyinstaller -F -c See_the_visual.py -p control_zi1.py -p control_zi2.py -p control_zi3.py -p control_zi4.py -p My_interface.py -p zi1.py -p zi2.py -p zi3.py -p zi4.py --hidden-import control_zi1 --hidden-import control_zi2 --hidden-import control_zi3 --hidden-import control_zi4 --hidden-import My_interface --hidden-import zi1 --hidden-import zi2 --hidden-import zi3 --hidden-import zi4
-
3.这个就是我打包的命令:
pyinstaller -D -i H.ico See_the_visual.py -p ExamThread.py -p VideoTHread.py -p VolumeThread.py --hidden-import pkg_resources.py2_warn
-D 代表生成一个文件夹并且打包成exe,注意不能用-F替换-D,因为那样子的话会提示下图,说你找不到dll,即使你将需要的库复制到dist文件下或者dll改为相对路径或者绝对路径都不行(-F是不将代码都放到exe里面和-D是不一样的,而且-D运行速度会快一点)。当你已经测试完代码没问题,那么加上-w,可以去掉小黑窗
-
-i H.ico 是打包后的exe,记得jpg那些格式要先转ico才可以,直接改后缀是不行的。
-
See_the_visual.py 是主程序,-p Examthread.py那些是其他文件
-
--hidden-import pkg_resources.py2_warn 是为了解决下图的 setuptools问题:可以参考这篇文章
-
4.记得将资源文件(图片,视频)和要调用的dll复制到生成的See_the_visual文件夹下面。
-
5.如果代码要用视频但pyinstaller打包时候VideoCapture()不响应问题的处理:
看这篇文章,我是32位打包的,所以也是要32位的dll
查看pip包列表和对应包位置:
pip list
pip show opencv-python
因为我在anconda的环境,我先要激活环境:
-
activate python32
找到opencv_videoio_ffmpeg430.dll这个文件并复制到生成的See_the_visual文件夹下面即可
-
4.对了记得运行不了的话,去cmd里面或者pycharm里面的终端去运行exe看报错,否则一闪而过你看不到
-
5.记得如果你用到matplotlib,如果版本过高你会打包不了:会报:Could not find the matplotlib data files,
-
如果版本过低你又运行不了说你缺少一个包(参考这篇文章解决):
-
eg:matplotlib = 3.0.0版本,不可画图,虽然打包后不警告,但画不了图,说某个函数找不到
-
matplotlib = 3.1.3.版本,可以画图,但打包会有警告(警告就警告呗),3.1.3,YES!
-
matplotlib = 3.3.0版本,不能打包exe,说找不到matplotlib
-
-
所以pip uninstall matplotlib,然后重新下载所需版本就好:
-
python -m pip install matplotlib==3.1.3
-
6.可以查这个dll依赖什么库的命令:
-
pyi-bindepend YQNetCom.dll
-
7.想用--key=123456加密但是却报错:
-
pip install pycrypto的话安装失败
至今仍然没有解决。不用加密的话是正常的,以后再来研究一下吧,顺便把代码混淆,借助cython将python文件转换成c,并编译成pyd文件,和反编译都试一下。以后参考
对pyinstaller理解:
-
pyinstaller使用UPX压缩,pyinstall key打包加密只是针对依赖库,并没有对主程序做加密处理,main文件还是可以反编译得到源码的,所以最好将程序的入口函数写在一个单独的文件了里,并采用加密方式打包exe。
在代码里面尽量不要用import,能from.....import....就尽量用这个,因为如果是import的话,在打包的时候,会将整个包都打包到exe里面会导致打包文件过大,没有意义的增大了工具的大小!
打包时候遇到failed to execute cript,其实你去掉-w 就可以发现一些错误。
注意的问题:
1.如果没调用dll,就不用python32位环境(其实是因为python64位调用32位dll有点问题,而且python64调用别人给的64位版本的dll一直调用不了才换成32位环境哈哈)
2.路径那些最好弄成文件夹里面的相对路径:参考这篇文章,介绍dll和一些打包的问题
3.pyinstaller 成功打包EXE后 运行出现 failed to execute script ***.py,此时记得把资源文件以及调用的dll放到dist文件夹下面的文件里面。也有可能是其他报错,所以记得记得加上-w,然后在cmd里面或者pycharm里面运行这个exe来看一下是什么错误。
- 1.权限问题:
-
通常时在打包时出现的某些文件拒绝访问或没有权限执行某些操作等。解决这个的方法一般有这几个方面:
a)使用管理员权限运行cmd或其它命令行窗口
b)关闭杀毒软件
c)使用完全权限的管理员账户
-
2.中文路径:
-
pyinstaller打包后的路径使用中文没有问题,不过为了减少打包时候出错的可能,尽量将打包使用的资源文件和代码文件路径设置为英文。
-
3.打包后文件的大小:
-
通常python打包为可执行文件都会得到一个较大的包,这是无法避免的,但是我们还是可以通过一些方法来尽量精简打包后的执行程序:
-
a)在代码中减少不必要的import,如from xxx import *
b)在精简的运行环境(如原生python环境)下打包,缺什么包就下什么包,避免不必要的python包被打包入程序。尤其是anaconda这样的集成环境下打包的结果会大很多。
c)使用UPX
-
4.最坑的一点。就是当你使用错误的参数去打包或者打包到一半中断,等等此类运行到一半没了的情况。会导致你原来的py文件变成一个0KB的空文件。里面的代码会全部消失!!!所以以后需要有个良好的习惯,就是复制一份代码出来,用这个副本进行打包。并且参数出错,或者打错了导致失败时,检查下副本文件的py文件是否还存在再继续重新打包,不然打出来的就是空的文件,自然一直闪退,因为压根没内容