使用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
相关产品推荐
相关产品推荐

