Pyinstaller打包Django项目调用collect_submodules导入djoser.urls失败求助
问题原因
这个报错的核心是PyInstaller钩子执行collect_submodules('djoser.urls')时,导入djoser.urls会触发Django配置加载逻辑,但打包阶段运行环境未初始化Django配置,导致导入失败,无法完成依赖收集。
解决方案
- 方案1:修改hook文件,提前初始化Django配置
不要把钩子文件放在全局site-packages目录,建议放到你的Django项目根目录,新建hook-djoser.urls.py,内容如下:import os import django # 替换为你项目的settings路径 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "royalback.settings") django.setup() from PyInstaller.utils.hooks import collect_submodules hiddenimports = collect_submodules('djoser.urls') - 方案2:手动枚举依赖,跳过自动收集
如果你明确项目用到的djoser.urls下的子模块,不需要写钩子,直接在打包命令中添加对应隐式导入即可,例如:
根据你实际用到的djoser路由模块添加对应参数即可。--hidden-import djoser.urls.authtoken --hidden-import djoser.urls.jwt
调整打包命令
你需要在原有打包命令基础上添加必要参数,完整命令参考(Windows环境):
pyinstaller --noconfirm --onedir --console --name "royalback" ^ --additional-hooks-dir . ^ --collect-data djoser ^ --collect-data rest_framework ^ --add-data "C:/Users/Shudf/royalback/templates;templates" ^ --add-data "C:/Users/Shudf/royalback/static;static" ^ "C:/Users/Shudf/royalback/manage.py"
参数说明:
--additional-hooks-dir .读取当前项目目录下的自定义钩子文件--collect-data收集第三方库的静态资源、配置文件等非代码内容--add-data把你自己项目的模板、静态文件打包到产物中
运行产物注意事项
打包完成后运行exe前,需要先在终端设置环境变量,或者直接把配置写在manage.py最开头:
set DJANGO_SETTINGS_MODULE=royalback.settings royalback.exe runserver
内容的提问来源于stack exchange,提问作者marcelo.delta
相关产品推荐
相关产品推荐

