使用PyInstaller打包Python项目失败,提示streamlit包元数据未找到
看起来你遇到的是PyInstaller打包时无法识别streamlit包元数据的问题,我之前也碰到过类似的情况,给你几个可行的解决思路:
1. 先确认环境依赖是否正确安装
首先确保你是在项目对应的虚拟环境里操作的,有时候不同环境的包会有冲突。先激活你的虚拟环境,然后重新安装最新版的streamlit和PyInstaller:
pip install --upgrade streamlit pyinstaller
安装完成后再尝试打包,大概率能解决元数据识别的问题。
2. 手动指定PyInstaller的隐藏导入参数
如果上面的方法没用,可能是PyInstaller自动分析依赖时漏掉了streamlit的元数据模块。可以在打包命令里加上--hidden-import或者--collect-all参数,强制收集streamlit的所有相关文件:
- 方法一:指定隐藏导入
pyinstaller --hidden-import streamlit --hidden-import importlib.metadata main.py
- 方法二:直接收集整个streamlit包(更彻底)
pyinstaller --collect-all streamlit main.py
这个参数会让PyInstaller把streamlit的所有文件都打包进去,包括元数据文件,应该能解决找不到包元数据的错误。
3. 尝试降级到稳定版的streamlit
有时候新版本的streamlit和PyInstaller会有兼容性问题,你可以试试降级到一个经过验证的稳定版本,比如1.32.0版本:
pip install streamlit==1.32.0
安装完成后再重新打包,看看问题是否消失。
另外,打包完成后,记得检查生成的dist目录里的可执行文件,运行时如果还有其他依赖问题,继续用--hidden-import补充对应的模块就行。
你的原始错误信息如下,方便其他开发者参考:
Traceback (most recent call last):
File "importlib/metadata/init.py", line 407, in from_name
StopIterationDuring handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "main.py", line 5, in
File "PyInstaller/loader/pyimod02_importers.py", line 384, in exec_module
File "streamlit/init.py", line 63, in
File "PyInstaller/loader/pyimod02_importers.py", line 384, in exec_module
File "streamlit/version.py", line 18, in
File "importlib/metadata/init.py", line 987, in version
File "importlib/metadata/init.py", line 960, in distribution
File "importlib/metadata/init.py", line 409, in from_name
importlib.metadata.PackageNotFoundError: No package metadata was found for streamlit
[PYI-46881:ERROR] Failed to execute script 'main' due to unhandled exception!Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.[Proces voltooid]
备注:内容来源于stack exchange,提问作者W_Surenbroek

