PyInstaller未嵌入自定义库至EXE文件的问题解决
PyInstaller打包自定义库导入失败的解决方法
问题场景
项目文件结构:
folder_A - .. - .. - .. folder_B - folder_1 - custom_library_1.py - custom_library_2.py - custom_library_3.py - ... - folder_2 - custom_library_1.py - custom_library_2.py - custom_library_3.py - ... start.pyw
主文件start.pyw代码:
import os, sys def add_custom_lib(root, lib_folders=None): if lib_folders is None: lib_folders = [] for folder in lib_folders: sys.path.insert(0, os.path.join(root, "B_folder", folder)) if __name__ == "__main__": pwd = os.getcwd() add_custom_lib(pwd, lib_folders=["folder_1", "folder_2"]) import config as co app = mw.MainWindow()
打包操作流程:
- 执行初始打包命令:
pyinstaller --onefile start.pyw - 修改生成的
start.spec文件:a = Analysis( ['run.pyw'], pathex=[], binaries=[], datas=[('folder_B/folder_1', 'folder_B/folder_1'), ('folder_B/folder_2', 'folder_B/folder_2')], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], noarchive=False, ) - 重新打包:
pyinstaller start.spec
运行生成的EXE时出现错误:
ModuleNotFoundError: No module named 'config'
问题原因
start.spec中主文件名写错,将start.pyw误写为run.pyw- 代码中路径拼写错误:
B_folder应为实际文件夹名folder_B - 单文件打包后,PyInstaller会将文件解压到系统临时目录,此时
os.getcwd()获取的不是EXE所在目录,导致路径失效 - 动态导入的模块未加入
hiddenimports,PyInstaller静态分析无法识别
解决步骤
1. 修正代码路径错误
修改add_custom_lib函数中的文件夹名称:
def add_custom_lib(root, lib_folders=None): if lib_folders is None: lib_folders = [] for folder in lib_folders: sys.path.insert(0, os.path.join(root, "folder_B", folder))
2. 修正spec文件中的主文件名
将Analysis中的主文件改为正确的start.pyw:
a = Analysis( ['start.pyw'], # 其余参数保持不变 )
3. 适配打包后的运行路径
PyInstaller单文件打包后,可通过sys._MEIPASS获取临时解压目录,修改主逻辑:
if __name__ == "__main__": # 判断是否为打包后的运行环境 if getattr(sys, 'frozen', False): root = sys._MEIPASS else: root = os.getcwd() add_custom_lib(root, lib_folders=["folder_1", "folder_2"]) import config as co app = mw.MainWindow()
4. 添加隐藏导入模块
将动态导入的模块(如config、mw)加入hiddenimports:
a = Analysis( ['start.pyw'], pathex=[], binaries=[], datas=[('folder_B/folder_1', 'folder_B/folder_1'), ('folder_B/folder_2', 'folder_B/folder_2')], hiddenimports=['config', 'mw'], # 其余参数保持不变 )
5. 重新执行打包
pyinstaller start.spec
内容的提问来源于stack exchange,提问作者TurboC
相关产品推荐
相关产品推荐

