迁移至新服务器后Django无法导入模块问题求助
这种情况我之前迁移Django项目时也碰到过,明明依赖版本都核对过了还是导包失败,大概率是一些容易被忽略的细节问题,你可以按下面的步骤逐一排查:
确认虚拟环境是否正确激活
有时候看着像是在虚拟环境里,但实际可能没激活成功。你可以执行which python和which pip,看看输出的路径是不是指向你用mkvirtualenv创建的虚拟环境目录。如果路径不对,重新用workon [你的虚拟环境名]激活后再尝试运行项目。检查Python主版本是否完全一致
就算依赖版本对了,如果原服务器和新服务器的Python主/次版本(比如3.8.10 vs 3.9.1)不一样,也可能出现隐性的兼容性问题。分别在两台服务器执行python --version,确保版本号完全匹配。排查本地模块的路径问题
如果你项目里有自定义的本地模块(不在site-packages里的自有包),要确认这些模块的路径是否被Python识别。可以在项目根目录运行python -c "import sys; print(sys.path)",看看你的项目根目录或者自定义模块所在的目录有没有在输出的路径列表里。如果没有,可能需要在manage.py开头手动添加路径,或者检查项目目录结构在scp传输过程中有没有被破坏。检查系统级依赖是否缺失
有些Python包(比如涉及C扩展的psycopg2-binary、pillow)不仅需要pip安装,还依赖系统层面的库。比如psycopg2需要新服务器安装libpq-dev,pillow需要libjpeg-dev等。你可以先看清楚导入失败的具体模块名称,然后查一下该模块对应的系统依赖,用服务器的包管理器(apt/yum)安装后,重新执行pip install -r requirements.txt。清理缓存后重新安装依赖
有时候pip缓存的旧包可能导致版本冲突或安装不完整。你可以先执行pip cache purge清理缓存,然后删除虚拟环境重新创建一个干净的,再重新安装依赖试试。核对导入语句与文件名的大小写
Linux系统是大小写敏感的,如果原服务器开发时文件名/模块名大小写不规范(比如MyUtils.py和myutils.py混用),传输到新服务器后可能因为大小写不匹配导致导入失败。仔细核对导入语句里的模块名和实际文件/目录的大小写是否完全一致。
内容的提问来源于stack exchange,提问作者CDoc

