You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu部署Django MySQL报NameError: name '_mysql' is not defined

问题根因

报错核心是Apache加载的mod_wsgi模块绑定的Python版本,和你虚拟环境使用的Python3.7版本不匹配。
从错误日志可直接定位问题:你虚拟环境的第三方包都安装在python3.7/site-packages路径下,但mod_wsgi运行时调用的是系统自带的/usr/lib/python3.9/importlib。mysqlclient是包含C扩展的包,跨Python大版本(3.7 vs 3.9)加载预编译的二进制扩展时,会因为Python ABI接口不兼容无法加载_mysql.so文件,最终抛出导入失败、_mysql未定义的错误。
虚拟环境下手动执行runserver、migrate正常,是因为激活虚拟环境后调用的是venv内置的Python3.7解释器,版本完全匹配,C扩展可正常加载。

排查步骤
  • 执行apache2ctl -M | grep wsgi确认mod_wsgi已加载,再通过dpkg -l | grep mod-wsgi查看系统安装的mod_wsgi对应的Python版本,Ubuntu默认源里的libapache2-mod-wsgi-py3绑定的是系统默认Python版本(当前环境为3.9)。
  • 执行/var/www/myproject/myname/venv/bin/python --version确认虚拟环境Python版本为3.7,和mod_wsgi绑定版本不一致即可坐实问题。
解决方案

二选一即可,优先选方案1,操作成本最低。

方案1:统一使用系统Python3.9重建虚拟环境

  1. 先安装编译依赖:
    apt update && apt install -y python3.9-dev python3.9-venv default-libmysqlclient-dev build-essential
    
  2. 重建虚拟环境并重装依赖:
    cd /var/www/myproject/myname
    rm -rf venv
    python3.9 -m venv venv
    source venv/bin/activate
    pip install -r requirements.txt
    python manage.py migrate
    
  3. 修改Apache虚拟主机配置,替换原有WSGIDaemonProcess行,不要硬编码site-packages路径:
    WSGIDaemonProcess myprocess python-home=/var/www/myproject/myname/venv python-path=/var/www/myproject/myname
    WSGIProcessGroup myprocess
    

    用python-home参数指定虚拟环境根目录是mod_wsgi官方推荐写法,会自动匹配对应版本的site-packages路径,避免手动拼路径导致的版本、路径错误。

  4. 修复项目目录权限,重启Apache:
    chown -R www-data:www-data /var/www/myproject/myname
    systemctl restart apache2
    
    重启后访问站点即可恢复正常。

方案2:为Python3.7编译安装匹配版本的mod_wsgi(不想替换现有虚拟环境版本时选这个)

  1. 卸载系统默认安装的不匹配mod_wsgi:
    apt remove -y libapache2-mod-wsgi-py3
    apt install -y apache2-dev
    
  2. 在Python3.7虚拟环境中安装对应版本的mod_wsgi:
    /var/www/myproject/myname/venv/bin/pip install mod-wsgi
    
  3. 执行/var/www/myproject/myname/venv/bin/mod_wsgi-express module-config,将输出的LoadModule等配置行写入/etc/apache2/mods-available/wsgi.load文件,再执行a2enmod wsgi启用模块。
  4. 参照方案1的第3、4步修改虚拟主机配置、修复权限、重启Apache即可。
避坑说明
  • 禁止在WSGIDaemonProcess配置中硬编码site-packages绝对路径,不同Python版本的site-packages层级、路径存在差异,极易出现版本错配问题。
  • 所有带C扩展的Python包(包括mysqlclient、mod_wsgi等),必须和运行时加载的Python解释器大版本完全一致,跨版本加载无兼容可能,必然触发导入错误。

内容的提问来源于stack exchange,提问作者Davidoffo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:15:45