使用pyinstaller对gradio和chromadb进行打包
解决gradio和chromadb的打包问题
- 背景
- 问题
- gradio和gradio_client模块
- chromadb模块
- 解决
背景
python项目里包含了gradio和chromadb模块,使用pyinstaller后总有模块找不到,这里分享一个办法一招解决。
问题
gradio和gradio_client模块
gradio在被打进exe后执行报错:
No such file or directory: gradio_client\types.json
这个主要原因是gradio和gradio_client相关模块没有被打进去。
还有一类报错:
[Errno 2] No such file or directory: gradio\blocks_events.pyc
这是因为在执行时默认去查找pyc文件,找不到报错。
chromadb模块
chromadb在被打进exe后执行报错:
ModuleNotFoundError: No module named'chromadb.telemetry.product.posthog'
这主要是因为chromadb的相关子模块没有被包进去。
解决
针对这两类问题,解决方案分两步:
1.输出.spec文件
pyinstaller --collect-data=gradio_client --collect-data=gradio --collect-data=chromadb -F rag_demo.py
2.在生成的rag_demo.spec文件中
Analysis部分添加
module_collection_mode={ 'gradio': 'py',}
因为我们希望 gradio 包的 .py 文件以某种特定方式被收集,比如直接将 .py 文件保留在打包后的文件结构中,而不是被编译成 .pyc 文件或者被压缩进 PYZ 文件里。