盘点在打包python文件成exe并运行过程中,遇到的问题:
1,打包出错, FileNotFoundError: ........lib\\site-packages\\pyyaml-5.3.1 -py3.6-win-amd64.egg\\EGG-INFO\\top_level.txt
2, 运行exe文件出错, ModuleNotFoundError: No module named 'statsmodels.__init__._version'

一、打包exe

pyinstaller -F -w -i xxx.ico xxx.py

参数说明:

-F 表示打包为单个exe,
-D 表示打包为一个文件夹,含exe
二者总体大小相当,我的程序打包出来前者是 355MB,后者文件夹压缩后 358MB,未压缩是992MB。
前者运行时 启动较慢,约10s,后者相对较快。
-w 表示运行exe时不显示跳出黑框,第一次尝试打包时建议显示,这样exe运行不成功可以查看问题原因。
-i 表示设置exe的图标,为.ico文件,可去专门的icon网站挑选下载(如:爱给 图标下载,ICON(PNG/ICO/SVG/矢量) easyicon 免费下载 - 爱给网
xxx.py为主文件, 若该文件内import了其他.py文件,会跟着导入的
运行完后xxx.py所在路径下会生成一个同名的xxx.spec文件,也是python格式。
也可以通过pyinstaller xxx.spec的方式打包。
注意采用pyinstaller xxx.spec的方式打包时,针对py方式的设置是无效的,如 -hidden-import=xxxmodel。
option(s) not allowed:
  --hidden-import/--hiddenimport
makespec options not valid when a .spec file is given
这时应该直接到.spec文件中相应位置手动修改。
遇到的问题:
打包失败,提示找不到文件:
FileNotFoundError: ........lib\\site-packages\\pyyaml-5.3.1 -py3.6-win-amd64.egg\\EGG-INFO\\top_level.txt
当时没截图,类似下图这样的。
采用了该文( 【Pyinstaller】成功解决FileNotFoundError: ‘...\\pyyaml-5.3.1-py3.6-win-amd64.egg\\EGG-INFO\\top_level.txt‘_摇曳的树的博客-CSDN博客)提供的方法解决了问题,方法就是在该报错提示的路径下新建一个空的文件 top_level.txt。

二、运行exe

双击运行,或者拖到cmd窗口运行。
遇到的问题:
ModuleNotFoundError: No module named 'statsmodels.__init__._version'
在pycharm运行时均正常,只是打包后找不到该模块。
尝试过在py程序中加入下列导入命令,都没用。
from statsmodels.__init__ import __version__
import statsmodels
--hidden-import= XXX 的方式来打包。不过他这里跟我的问题还不大一样,因此采用了他的方法,加入了这个什么version模块,还是未能解决。
最后成功解决问题的办法是我自己琢磨出来的权宜之计,因为我的程序里并没涉及version模块,看起来这个模块只是跟版本的获取更新相关,因此 通过放弃导入_version这个模块的方式来解决(逃避)这个报错问题
具体的做法是,找到statsmodels库所在的位置,通常是C:\Users\用户名\Anaconda3\Lib\site-packages\statsmodels
找到 _version.py,打开,发现里面只有一个字典和一个get_version函数。注意到字典里version这个键值对。
找到 __init__.py,打开,发现里面第二行导入了_version,报错就是在这一步(报错会提示到这一步的),
把这一行注释掉,同时把最后几行调用get_vesion函数赋值给__version__这一步改成手动赋值,值copy自_verison.py定义的字典中(见下图)。
完成这两项修改后,重新打包并运行exe,还有错误,也就是还有其他文件也导入了这个__version__属性,根据提示,对api.py进行了同样的修改。
重新打包并运行,成功!
这只是绕过导入 statsmodels.__init__._version这个模块的偷懒办法。打包好后建议回原样,以免后续使用该模块出现版本更新的问题。
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐