pip已装django-grappelli但Django提示模块找不到如何解决
问题场景
已激活Django项目专属虚拟环境,在环境内执行pip命令安装django-grappelli:
pip install django-grappelli
安装后执行pip list,返回列表中显示django-grappelli 3.0.3已安装:
Package Version ---------------- ------- asgiref 3.5.2 Django 4.0.5 django-grappelli 3.0.3 pip 22.1.2 psycopg2 2.9.3 setuptools 58.1.0 sqlparse 0.4.2 tzdata 2022.1
按照官方文档完成两步配置:
- 在settings.py的INSTALLED_APPS中将
'grappelli'放在'django.contrib.admin'之前:
INSTALLED_APPS = ( 'grappelli', 'django.contrib.admin', )
- 添加URL路由配置:
from django.conf.urls import include urlpatterns = [ path('grappelli/', include('grappelli.urls')), # grappelli URLS path('admin/', admin.site.urls), # admin site ]
配置完成后执行py manage.py check,抛出错误:
ModuleNotFoundError: No module named 'grappelli'
手动查看虚拟环境下的Lib/site-packages目录,未找到django-grappelli相关文件;进入Python交互环境尝试导入grappelli、django-grappelli均提示模块不存在。
当前运行环境为Windows系统,Python版本3.10.4,此前在其他简单Django项目中使用django-grappelli未遇到同类问题。
项目目录结构参考
排查方向与解决方案
- 验证pip与Python解释器绑定关系
Windows环境下虚拟环境激活后常出现环境变量优先级问题,导致调用的pip、python不是当前虚拟环境版本。在激活虚拟环境的终端中分别执行where pip和where python,确认返回的第一条路径都在当前虚拟环境的Scripts目录下。如果路径不匹配,直接使用解释器调用pip的方式强制安装,彻底规避路径错乱问题:
该方式可保证包安装到当前执行命令的Python解释器对应的site-packages目录中。python -m pip install django-grappelli - 处理安装过程文件写入异常
如果路径匹配但site-packages下无grappelli文件夹,属于pip安装时权限不足,文件写入失败但仅记录了安装元数据,导致pip list误判已安装。先执行pip uninstall -y django-grappelli清理残留,以管理员身份重新打开终端,激活虚拟环境后重新执行安装,安装完成后进入虚拟环境的Lib\site-packages目录确认存在grappelli文件夹即可。注意:pip安装包名为
django-grappelli,Python实际导入的模块名是grappelli,带横杠的包名无法直接导入。 - 修复虚拟环境激活失效问题
执行以下命令打印Python加载路径:
如果输出路径中不包含当前虚拟环境的site-packages目录,说明虚拟环境激活逻辑损坏。直接删除原有虚拟环境文件夹,执行以下命令重新创建虚拟环境,再重装所有依赖:python -c "import sys; print('\n'.join(sys.path))"
同时在Windows「管理应用执行别名」设置中关闭Python相关的应用商店别名,避免系统自带的应用商店Python抢占路径优先级,导致解释器调用错乱。py -3.10 -m venv venv - 修正IDE运行配置
如果终端下执行python manage.py check正常,但IDE中运行报错,说明IDE的Python解释器未选中当前虚拟环境版本,在IDE的项目解释器设置中,手动选择虚拟环境Scripts目录下的python.exe即可。 - 修正Django4.0+兼容问题
当前使用的Django版本为4.0+,include和path都需要从django.urls导入,现有路由文件的导入语句有误,解决模块找不到的问题后需要修正导入逻辑,否则会触发后续导入错误:from django.urls import include, path from django.contrib import admin urlpatterns = [ path('grappelli/', include('grappelli.urls')), path('admin/', admin.site.urls), ]
内容的提问来源于stack exchange,提问作者Fernando Soares
相关产品推荐
相关产品推荐

