重点:不要在全局环境 pip install pyinstaller。习惯各个项目独立环境的,就不要在全局环境 pip install pyinstaller,不小心安装了的,也请删掉。很容易一不小心掉坑。
因为有时忘记启动venv,调用路径就是全局的路径。启动了venv,但该venv没有安装pyinstaller,开发调试顺利,打包ModuleNotFoundError
对于新手来说 pyinstaller 坑还是比较多的。
1、首先遇到的是闪退问题。
解决办法:
在打包的py文件主函数最后一行添加以下代码
input("please input any key to exit!")
然后把exe拖进cmd命令窗口,回车运行,就能够看到报错信息了。
》》》注意打包时不能带 --noconsole参数,否则就算在cmd窗口也看不到报错信息的。例如:pyinstaller test.py --noconsole 生成的test.exe 拖到cmd窗口执行,出错了,错误信息也不会显示出来
2、提示 ModuleNotFoundError: No module named 'xxx'
试了百度的那些方法,都不太好使,虽然加入 --hidden-import参数和绝对路径能解决,但缺好多module啊,每次仅能修一个好痛苦。
后来我试了最简单的,创建一个全新的venv环境,只有一个.py文件,整个程序只import一个module(我用MySQLdb这个module测试),在pycharm的terminal里面也成功pip install mysqlclient了。
生成的exe,依然提示ModuleNotFoundError: No module named 'MySQLdb'。
我突然想起,这个venv环境里,我并没有安装过pyinstaller这个包( pip install pyinstaller ) 所以,我在pycharm的terminal中执行 pyinstaller test.py时,调用的是全局环境的pyinstaller,而全局环境中没有安装mysqlclent。在pycharm的terminal中执行 pyinstaller test.py时,全局的pyinstaller仅在全局环境中找mysqlclent,找不到就没有导入了。
解决方案:
1、先在venv环境中安装pyinstaller这个包,
2、然后在venv环境中(terminal)执行 pyinstaller test.py
允许test.exe 成功!没有报错了!