首先定位到需要打包的文件目录,如笔者的目录:
Main.py文件就是我需要打包的主文件,D:…\A13就是我需要的目录。
打开anaconda prompt窗口(或者cmd窗口,cmd窗口我没试过,不确定能否成功),定位到上面的目录,如图所示:
输入打包命令:
pyinstaller -F -c main.py -p doc2vecTraining.py
Main.py是主程序,-p之后是相关的py文件,如果还需添加py文件,依然是-p xxx.py,直至写完。-F表示将所有配置资源都打包成一个文件,也可将-F改为-D表示生成目录;-c表示显示命令行窗口,也可将-c改为-w表示不显示命令行窗口,不过显示命令行窗口可以看见你的错误,方便解决;具体参数解释可参考pyinstall的官网介绍,也可参考下面的博文,解释较清楚:
https://blog.csdn.net/weixin_39000819/article/details/80942423
执行完这条命令后报错:
这时在你的打包目录下,会生成一个main.spec文件,在这个文件中加入代码:
import sys
sys.setrecursionlimit(1000000)
然后执行将之前执行的命令中的main.py改成main.spec,即
pyinstaller -F -c main.spec -p doc2vecTraining.py
看到这个运行,就表示exe生成成功了。
但是运行exe的时候还会出现很多问题,以下是笔者碰到的问题总结:
(1)报错:No module named xxx
解决方法:在spec文件中导入隐含包
Hiddenimports=[‘wx._html’],如图所示:
(2)找不到文件
解决方法:如果程序使用到的一些文件如TXT文件,是用相对路径引用的话,exe文件应该和这些文件在同一目录下;或者将源码中的相对路径改为绝对路径。
(3)exe在本机上可以成功运行,但在其他电脑的无法运行
出现这个问题的情况很有可能是其他电脑上没有装程序中用到的包或者库,我的问题是在我的程序中用到了jieba库,但是在其他电脑上可能没有安装jieba等第三方库,导致程序找不到相关的依赖文件。
解决方法:首先在源码文件main.py所在的目录下,新建一个static文件夹,找到库包文件目录(比如我的是D:\anaconda3\Lib\site-packages\jieba),复制到该目录下,其他第三方库同理,如笔者的:
第二步,打开main.spec文件,找到下面这段:
其中一行:datas=[],
修改为:datas=[(‘static’,’.’)];
意思是把static目录下的内容打包,并且在运行是将该目录下的内容释放到临时目录的相对位置,此处设置的’.’就表示临时目录本身。
最后再重新执行pyinstaller -F -c main.spec -p doc2vecTraining.py命令,重新打包,将整个文件夹都打包到其他电脑上,exe就能成功运行了。
相关博文:
http://blog.sina.com.cn/s/blog_53d6797101030588.html
https://www.cnblogs.com/7rhythm/archive/2018/12/29/10196745.html