PyInstaller打包含g4f LocalClient脚本时libllmodel.dll缺失问题修复
问题描述
切换使用g4f API的LocalClient()类后,用PyInstaller编译Python脚本为exe时出现如下错误:
Traceback (most recent call last): File "PyInstaller\loader\pyimod03_ctypes.py", line 53, in __init__ File "ctypes\__init__.py", line 376, in __init__ FileNotFoundError: Could not find module 'C:\Users\USER\AppData\Local\Temp\_MEI184642\gpt4all\llmodel_DO_NOT_MODIFY\build\libllmodel.dll' (or one of its dependencies). Try using the full path with constructor syntax. The above exception was the direct cause of the following exception: Traceback (most recent call last): File "My_Diary.py", line 1, in <module> import tkinter, tkinter.filedialog, tkinter.messagebox, pickle, os, sys, docx, typing, My_Diary_interface, My_Diary_window, CTkMenuBar, locale, CTkMessagebox, My_Diary_converterer, My_Diary_AI, tkterminal, My_Diary_PDF_viewer, asyncio File "<frozen importlib._bootstrap>", line 1176, in _find_and_load File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "My_Diary_AI.py", line 1, in <module> import g4f, g4f.local, typing, My_Diary_AI_interface, asyncio File "<frozen importlib._bootstrap>", line 1176, in _find_and_load File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "g4f\__init__.py", line 6, in <module> File "<frozen importlib._bootstrap>", line 1176, in _find_and_load File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "g4f\models.py", line 5, in <module> File "<frozen importlib._bootstrap>", line 1176, in _find_and_load File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "g4f\Provider\__init__.py", line 42, in <module> File "<frozen importlib._bootstrap>", line 1176, in _find_and_load File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "g4f\Provider\Local.py", line 5, in <module> File "<frozen importlib._bootstrap>", line 1176, in _find_and_load File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "g4f\locals\provider.py", line 5, in <module> File "<frozen importlib._bootstrap>", line 1176, in _find_and_load File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "gpt4all\__init__.py", line 1, in <module> File "<frozen importlib._bootstrap>", line 1176, in _find_and_load File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "gpt4all\gpt4all.py", line 23, in <module> File "<frozen importlib._bootstrap>", line 1176, in _find_and_load File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "gpt4all\_pyllmodel.py", line 71, in <module> File "gpt4all\_pyllmodel.py", line 61, in load_llmodel_library File "PyInstaller\loader\pyimod03_ctypes.py", line 55, in __init__ pyimod03_ctypes.install.<locals>.PyInstallerImportError: Failed to load dynlib/dll 'C:\\Users\\USER\\AppData\\Local\\Temp\\_MEI184642\\gpt4all\\llmodel_DO_NOT_MODIFY\\build\\libllmodel.dll'. Most likely this dynlib/dll was not found when the application was frozen.
此前使用g4f API的应用可正常打包,仅切换为LocalClient()后出现该问题。
解决方案
1. 手动添加dll文件到打包资源
- 找到Python环境中
libllmodel.dll的路径,通常位于你的Python安装目录\Lib\site-packages\gpt4all\llmodel_DO_NOT_MODIFY\build\libllmodel.dll - 使用PyInstaller的
--add-data参数打包,Windows系统命令示例:
(注意Windows用分号分隔源路径和目标路径,Linux/macOS用冒号)pyinstaller --add-data "C:\Python\Lib\site-packages\gpt4all\llmodel_DO_NOT_MODIFY\build\libllmodel.dll;gpt4all\llmodel_DO_NOT_MODIFY\build" My_Diary.py
2. 通过spec文件配置打包
- 先生成spec文件:
pyinstaller --name My_Diary My_Diary.py - 打开生成的
My_Diary.spec文件,在datas列表中添加dll路径配置:datas=[('C:\\Python\\Lib\\site-packages\\gpt4all\\llmodel_DO_NOT_MODIFY\\build\\libllmodel.dll', 'gpt4all/llmodel_DO_NOT_MODIFY/build')], - 用spec文件重新打包:
pyinstaller My_Diary.spec
3. 检查并补充dll依赖
- 若仍报错,可能是
libllmodel.dll存在缺失的依赖库,用Dependency Walker工具扫描该dll,找出缺失的依赖文件,同样通过--add-data或spec文件添加到打包资源中。
4. 代码中动态指定dll路径(备选)
- 在导入g4f前,手动设置dll路径环境变量:
import os import sys if hasattr(sys, '_MEIPASS'): # 打包后运行时的临时目录 dll_path = os.path.join(sys._MEIPASS, 'gpt4all', 'llmodel_DO_NOT_MODIFY', 'build', 'libllmodel.dll') os.environ['LLMODEL_LIBRARY'] = dll_path import g4f
内容的提问来源于stack exchange,提问作者Anonymous6598
相关产品推荐
相关产品推荐

