最近在用PyQt写一个界面程序,需要把.py文件打包成.exe文件,这样在没有Python环境的电脑上也能正常使用,很方便。网上99%的人都建议用pyinstaller进行打包,这里面也遇到了很多问题,先记录一下。
1.首先是环境:操作系统:64位win10,python版本:3.6.4,PyQt版本:5.6.2(以上均为anaconda5.1.0自带),程序中使用了Python机器学习与科学计算第三方库:sklearn,scipy,numpy,pandas,matplotlib等。
2.打包过程:
2.1 首先下载适合自己机器版本的pyinstaller,这个我是在anconda自带的命令行工具Anaconda Prompt里直接用pip工具进行安装:pip install pyinstaller,一般这样就可以直接安装成功。
2.2 接下来就可以打包了,不过在此之前先要做一件事,把pyinstaller添加到环境变量里面。在...(你的anaconda的安装文件夹)\Scripts下会有一个pyinstaller.exe文件,把...\Scripts路径添加到环境变量里,这样就可以在系统的任何位置使用pyinstaller这个命令了。(关于环境变量的概念和添加方法就不赘述了,不清楚的可以自行百度。)
2.3 万事俱备,只欠东风。这个时候,找到待打包的.py文件所在的文件夹,shift+鼠标右键选择 在此处打开命令窗口,这样当前路径已经在这个文件夹了,用命令 pyinstaller 文件名字.py,会看到程序已经在跑了。一会能看到文件夹中多出了一个dist文件夹,一个build文件夹和一个.spec文件(文件名和.py文件的文件名一致)。dist是发布文件夹,我们想要的.exe文件就在里面。这时双击这个exe文件出现个命令行窗口然后一闪而过,打开命令行输入x.exe回车发现错误:ModuleNotFoundError:No module named typedefs,经过不断搜索发现是sklearn和scipy库的问题,有些库不能自动导入,参考了这里点击打开链接的Ahad aghapour的回答后,在.spec文件中将hiddenimports=[]修改为:hiddenimports=['cython', 'sklearn', 'sklearn.ensemble','sklearn.neighbors.typedefs','sklearn.neighbors.quad_tree','sklearn.tree._utils','scipy._lib.messagestream']后,再运行命令pyinstaller x.spec,等它跑完之后再点击.exe文件会发现这个错误没有了~(好像是和pandas,scipy,sklearn相关的导入错误都可以这样QAQ)
2.4 谁知一波未平一波又起,出现了新的错误:This application failed to start because it could not find or load the Qt platform plugin "windows"。看这意思应该库的导入是没有问题了,只是提示缺少Qt组件无法正常启动,参考网上的评论,需要有...\Qt\plugins\platforms这个文件夹,可我明明有啊。抱着试一试的态度,我把这个文件夹拷贝到和.exe文件一个路径下,最终完美解决,出现了想要的Qt界面~
3.还需要注意的问题:
3.1 如果你的GUI程序带有图片(或者其它资源)的文件夹(我的是在\res文件夹下),需要把这个文件夹拷贝到.exe文件同一路径下。
3.2 如果你的.py文件不止一个,仅仅需要把其它.py文件都放在一个目录下,只对入口.py文件打包即可。