使用python3.7+anaconda环境编写了个程序,里面使用了numpy pandas xgboost等包
想用pyinstaller打包成exe,pip install pyinstaller后无法打包成exe文件
别人说是pyinstaller不兼容python3.7
遂安装py3.6环境,试图隔离不需要的包安装,失败。只好安装venv:
pip install virtualenv
,命名此环境为venv1,什么包都没有
参考 https://blog.csdn.net/wskzgz/article/details/88993910
cmd(管理员)进入 \venv1\venv\Scripts\ 文件夹后输入activate,激活环境,此时提示符前会有(venv)字样
pip install 需要的包,只安装需要的包,这样可以减小打包后程序大小,并防止奇奇怪怪的错误
还是这个venv环境,安装好后cd进入python程序所在的路径:
pyinstaller -D ***.py
打包出exe文件了!在打包文件夹的dist文件夹里,命令行cd到exe文件所在路径后运行,出错,提示distutils模块出错,
ModuleNotFoundError: No module named 'distutils'
[10373] Failed to execute script <name here>
但distutils是python自带的模块,所以不是包没装全的问题,找到如下方法:
# work-around for https://github.com/pyinstaller/pyinstaller/issues/4064
import distutils
if distutils.distutils_path.endswith('__init__.py'):
distutils.distutils_path = os.path.dirname(distutils.distutils_path)
将以上代码贴入打包exe时生成的 *.spec文件开头,清理build目录重新生成exe文件就可以了。生成方法:
pyinstaller -D ***.spec
pyinstaller又会像刚才一样在打包一次,期间会问你此操作会删除dist文件夹全部的文件要继续吗,摁y继续,然后就又生成了一个exe文件,还在dist文件夹里。
命令行cd到exe文件所在路径后运行,出错,提示缺少xgboost的dll。解决办法:打开venv所在的*\venv1\venv\Lib\site-packages\xgboost*,发现里面确实没有dll,可以从网上找xgboost.dll文件放里面,如下图。我从网上找的都不行,从虚拟环境外面的anaconda文件夹里找到了,复制粘贴到下图所在的文件夹。
然后把整个文件夹扔到打包出的exe文件所在同目录下。不用再打包一遍了,直接cmd里运行,成功。
##########################分割线#################################
转天打包另一个文件,有了一些新问题
这次没在venv里打包,直接在3.6&anaconda环境里打包成功了
生成exe后运行,抛出错误 ModuleNotFoundError: No module named 'typedefs‘
查阅得此文章 https://blog.csdn.net/qq_36698385/article/details/99608354
基本情况差不多,稍微有点区别
在打包过程中生成的xxx.spec文件中(xxx是自己打包时的py文件名)的第二行添加如下两行代码:
import sys
sys.setrecursionlimit(5000)
然后再输入命令 pyinstaller xxx.spec --hidden-import sklearn.neighbors.typedefs,进行打包
成功