pyinstaller 打包错误解决

本文详述了在将Python程序打包成exe过程中遇到的两个主要问题及其解决方案。一是打包时的FileNotFoundError,通过在指定路径创建空的top_level.txt文件解决;二是运行exe时的ModuleNotFoundError,通过修改statsmodels库源码来规避导入特定模块。此外,还分享了打包参数的使用和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

盘点在打包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‘_摇曳的树的博客-优快云博客)提供的方法解决了问题,方法就是在该报错提示的路径下新建一个空的文件 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这个模块的偷懒办法。打包好后建议回原样,以免后续使用该模块出现版本更新的问题。
当你尝试卸载 Anaconda 时遇到错误信息“`anaconda3 is not a valid directory. Please run the uninstaller from a conda directory`”,这通常是因为你在运行卸载程序时所处的工作目录不是有效的 Anaconda 安装路径。 Anaconda 的安装和管理工具 `conda` 需要在正确的上下文中工作。如果当前命令行环境不在合法的 Anaconda 目录下,则无法识别并正常启动卸载进程。以下是解决这个问题的具体步骤: ### 正确执行 Anaconda 卸载的方式 #### Windows 系统 对于大多数用户来说,在 Windows 上最简单的办法就是通过图形界面完成: 1. **打开控制面板**:点击开始菜单 -> 搜索栏输入 "Control Panel" 并选择打开。 2. **进入程序列表**:导航至 “Programs and Features” 或者直接搜索此选项。 3. **找到 Anaconda 条目**:滚动查找名为 'Anaconda...' 开头的应用条目,选中它然后点击上方的 "Uninstall" 按钮按提示操作即可。 如果你更倾向于使用命令行方式进行卸载,请确保是在合适的文件夹内运行卸载脚本,并且最好先关闭所有与 Python、Jupyter Notebook 及其他关联应用程序相关的窗口和服务。 #### macOS/Linux 系统 针对 Unix-like 操作系统(如 Linux 和 MacOS),你可以按照下面的方法来进行彻底清理: 1. **删除主配置文件**:首先需要移除位于家目录下的隐藏 `.condarc` 文件以及其它可能存在的缓存数据; ```bash rm -rf ~/.condarc ~/anaconda3 ``` 2. **清除环境变量设置**:编辑 shell profile 脚本(例如 `.bashrc`, `.zshrc`),去掉关于 Conda 初始化的部分;可以利用文本编辑器手动修改,也可以借助 grep 工具快速定位相关内容; ```bash # 使用 sed 自动处理(适用于 bash) sed -i '' '/# >>> conda initialize/,/# <<< conda initialize/d' ~/.bash_profile # 对于 zsh 用户 sed -i '' '/# >>> conda initialize/,/# <<< conda initialize/d' ~/.zshrc ``` 3. **重启终端会话**:让更改生效之后再继续下一步骤; 4. **执行官方提供的卸载指令** (仅限已成功加载过 conda environment) : ```bash conda install anaconda-clean anaconda-clean --yes ``` 5. 如果上述方法失败了或者从未成功激活过 conda env ,那么可以直接递归地将整个安装根目录删掉(`~/anaconda3`)。 6. 最后确认是否还有残留项存在于 PATH 中或其他地方影响到系统的正常使用状态。 请注意,在实际动手前备份重要资料总是明智之举!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值