You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

打包操作流程:

  1. 执行初始打包命令:
    pyinstaller --onefile start.pyw
    
  2. 修改生成的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,
    )
    
  3. 重新打包:
    pyinstaller start.spec
    

运行生成的EXE时出现错误:

ModuleNotFoundError: No module named 'config'

问题原因

  1. start.spec中主文件名写错,将start.pyw误写为run.pyw
  2. 代码中路径拼写错误:B_folder应为实际文件夹名folder_B
  3. 单文件打包后,PyInstaller会将文件解压到系统临时目录,此时os.getcwd()获取的不是EXE所在目录,导致路径失效
  4. 动态导入的模块未加入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:35:09