PyInstaller打包含子文件夹Python代码报错,是否无法实现?
PyInstaller完全能包含存放Python代码的子文件夹!
当然不是啦!PyInstaller完全支持打包包含Python代码的子文件夹,你遇到的报错大概率是打包配置没调整到位而已,咱一步步来解决:
先确认基础前提
首先要保证你的子文件夹是Python包——也就是里面必须有一个__init__.py文件(哪怕是空的都行),这样PyInstaller才能识别到它是一个可导入的模块集合。
两种解决方式,按需选择
1. 直接用命令行打包
如果你的项目结构是这样的:
main.py my_code_folder/ __init__.py utils.py config.py
- 如果PyInstaller能自动识别子文件夹模块,直接运行:
pyinstaller --onefile main.py - 如果自动识别失败(比如运行exe提示找不到模块),就用
--hidden-import参数手动指定要包含的模块:# 单个模块 pyinstaller --onefile --hidden-import my_code_folder.utils main.py # 或者直接指定整个包 pyinstaller --onefile --hidden-import my_code_folder main.py
2. 修改你的Spec文件(更灵活,推荐)
既然你已经在用spec文件打包,那直接调整里面的参数就行:
打开你的spec文件,找到Analysis部分的hiddenimports和datas(如果有非代码资源的话):
a = Analysis( ['main.py'], pathex=[], binaries=[], # 如果子文件夹里有非Python文件(比如配置文件、图片),用datas指定打包路径 datas=[('my_code_folder/*.ini', 'my_code_folder')], # 把你子文件夹里的模块或整个包加进hiddenimports hiddenimports=['my_code_folder', 'my_code_folder.utils', 'my_code_folder.config'], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], noarchive=False, )
修改完后,运行pyinstaller your_file.spec重新打包就行。
额外注意点
- 如果你在代码里用了相对导入(比如
from .utils import xxx),打包时可能会出现路径问题,建议改成绝对导入(from my_code_folder.utils import xxx)会更稳妥。 - 要是还是报错,可以打开PyInstaller的日志(加
--log-level DEBUG参数),看看具体是哪个模块没被打包进去,再针对性添加到hiddenimports里。
内容的提问来源于stack exchange,提问作者user5989986
相关产品推荐
相关产品推荐

