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

使用PyInstaller打包Python代码为exe时相对导入依赖报错求助

解决PyInstaller打包后相对导入报错的方案

1. 替换相对导入为绝对导入

将代码中的相对导入语句改为基于项目根包的绝对导入。比如把from .cli.login import login改成from your_package_name.cli.login import login(your_package_name是你项目根包的名称,对应包含__init__.py的根文件夹)。

确保项目根目录在Python的sys.path中,开发阶段可以手动添加,打包时PyInstaller会自动识别根包结构。

2. 显式声明隐藏依赖

PyInstaller可能无法自动识别某些相对导入的子模块,可通过参数强制指定:

  • 打包命令中添加--hidden-import:
    pyinstaller --hidden-import your_package_name.cli.login your_main_script.py
    
  • 或者编写自定义spec文件,在hiddenimports列表中添加依赖模块:
    a = Analysis(
        ['your_main_script.py'],
        hiddenimports=['your_package_name.cli.login'],
        # 其他默认参数...
    )
    
    之后用pyinstaller your_script.spec执行打包。

3. 动态调整导入路径或逻辑

在主脚本开头添加代码,将当前脚本所在目录加入sys.path,让Python能识别父包:

import sys
from pathlib import Path
# 将脚本所在目录添加到路径
sys.path.append(str(Path(__file__).parent))

或者改用动态导入方式规避相对导入限制:

import importlib
# 从当前包的cli.login模块导入login
login = importlib.import_module('.cli.login', package=__name__).login

4. 规范项目结构

确保项目结构符合Python包规范:

  • 每个子文件夹都添加空的__init__.py文件(Python 3.3+支持命名空间包,但PyInstaller打包时更兼容传统包结构)
  • 主脚本不要放在包内部,建议结构如下:
    your_project/
        your_package/
            __init__.py
            cli/
                __init__.py
                login.py
        main.py  # 主脚本放在根目录,而非your_package内
    
    主脚本中使用绝对导入调用子模块。

内容的提问来源于stack exchange,提问作者Ehsan Faramarzi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:40:04