新鲜的 python 3.7 / django 2.2.1 安装无法识别已安装 mysqlclient

Posted

技术标签:

【中文标题】新鲜的 python 3.7 / django 2.2.1 安装无法识别已安装 mysqlclient【英文标题】:Fresh python 3.7 / django 2.2.1 installation not recognising that mysqlclient is installed 【发布时间】:2019-09-30 13:54:02 【问题描述】:

我有一个全新的 django 2.2.1 项目,我刚刚安装到 OS X (10.14.4) 上的 python 3.7 virtualenv 中。经过一些挫折后,我安装了 mysqlclient,但是当我运行 django dev 服务器时,它无法识别它已安装:

以下是我目前采取的步骤:

brew install mysql
pipenv --three
pipenv install django==2.2.1
pipenv install mysqlclient
brew uninstall mysql
brew install mysql-connector-c
pipenv install mysqlclient
brew unlink mysql-connector-c
brew install mysql
django-admin startproject projectname

现在,我对开箱即用的 django 安装所做的唯一更改是将默认数据库后端更改为 django.db.backends.mysql,当我运行 django 服务器时,我得到以下信息:

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

但是,回到 virtualenv 并执行“pip install mysqlclient”会得到:

Requirement already satisfied: mysqlclient in /Users/<username>/.local/share/virtualenvs/<projectname>-KrUE_JNo/lib/python3.7/site-packages (1.4.2.post1)

任何想法为什么 django 看不到安装在 virtualenv 中的 mysqlclient?我可以确认以上所有内容都已在 virtualenv 中运行。我怀疑这与 OSX 让您安装它时遇到的问题有关,但我不知道如何将它分开。

我也尝试过replace mysqldb with pymysql as suggested here,但这会导致服务器给出不同的错误:

raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

Mysql 是这个项目的一个给定的,所以使用替代后端不是一个选项。非常感谢您的任何帮助,非常感谢。

更新:pip freeze 的输出:

Django==2.2.1
django-auth-ldap==1.7.0
Markdown==3.1
mysql-connector-python==8.0.16
mysqlclient==1.4.2.post1
protobuf==3.7.1
pyasn1==0.4.5
pyasn1-modules==0.2.5
PyMySQL==0.9.3
pyodbc==4.0.26
python-ldap==3.2.0
pytz==2019.1
simplejson==3.16.0
six==1.12.0
sqlparse==0.3.0
xmltodict==0.12.0

更新 2: 在 conor 的帖子(感谢 conor)之后,我再次使用新的 virtualenv 开始,并再次成功安装了 mysqlclient1.4.2.post1。这是 pip freeze 现在的输出:

Django==2.2.1
mysqlclient==1.4.2.post1
pytz==2019.1
sqlparse==0.3.0

当我执行 python manage.py runserver 时仍然遇到同样的错误:

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

更新 3: 以为我会尝试在 python 命令行上导入 MySQLdb 模块,看看我是否可以得到更多的见解,它会返回以下内容:

>>> import MySQLdb
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/<username>/.local/share/virtualenvs/<projectname>-KrUE_JNo/lib/python3.7/site-packages/MySQLdb/__init__.py", line 18, in <module>
    from . import _mysql
ImportError: dlopen(/Users/<username>/.local/share/virtualenvs/<projectname>-KrUE_JNo/lib/python3.7/site-packages/MySQLdb/_mysql.cpython-37m-darwin.so, 2): Symbol not found: _mysql_affected_rows
  Referenced from: /Users/<username>/.local/share/virtualenvs/<projectname>-KrUE_JNo/lib/python3.7/site-packages/MySQLdb/_mysql.cpython-37m-darwin.so
  Expected in: flat namespace
 in /Users/<username>/.local/share/virtualenvs/<projectname>-KrUE_JNo/lib/python3.7/site-packages/MySQLdb/_mysql.cpython-37m-darwin.so

【问题讨论】:

你能展示一下你是如何运行 Django 的吗? 嗨@GwynBleidD - 对不起,我应该考虑添加。我只是在做 ./manage.py runserver - 还是在 virtualenv 中 你的 virtualenv 的 pip freeze 的输出是什么? 点冻结输出(自发布问题以来我已经安装了一些不相关的软件包):Django==2.2.1 django-auth-ldap==1.7.0 Markdown==3.1 mysql-connector- python==8.0.16 mysqlclient==1.4.2.post1 protobuf==3.7.1 pyasn1==0.4.5 pyasn1-modules==0.2.5 PyMySQL==0.9.3 pyodbc==4.0.26 python-ldap= =3.2.0 pytz==2019.1 simplejson==3.16.0 六==1.12.0 sqlparse==0.3.0 xmltodict==0.12.0 安装这个版本的mysqlclient 1.3.13,因为错误消息提示,你有这个版本你有0.9.3。你读过邮件吗? 【参考方案1】:

已解决

所以看起来问题是在初始安装时 mysqlclient 库针对错误版本的 mysql 进行了编译(不知道这是怎么发生的),所以我不得不强制它重新编译。

步骤如下:

brew uninstall mysql
brew uninstall myysql-connector-c
pipenv uninstall mysqlclient
brew install mysql-connector-c

此时我们需要根据 conor 链接到的说明更新 /usr/local/bin/mysql_config(再次感谢 conor),即更改读取的行

libs="$libs -l "

libs="$libs -lmysqlclient -lssl -lcrypto "

那么,to fix the resultant "library not found for -lssl" error I used the answer from this question:

export PATH="/usr/local/opt/openssl/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"

然后最后强制mysqlclient重新编译重新安装mysql:

pip install --force-reinstall --ignore-installed --no-binary :all: mysqlclient
brew unlink mysql-connector-c
brew install mysql

感谢所有花时间提供帮助的人!

【讨论】:

【参考方案2】:

如果您使用的是 macos,请执行此操作

$ brew uninstall mysql
$ brew install mysql-connector-c
$ brew unlink mysql-connector-c
$ brew install mysql
$ pip install mysql-python

并按照此处的说明进行操作:https://pypi.org/project/mysqlclient/

【讨论】:

感谢 conor 但我认为 mysql-python 不适用于 python3?这就是为什么我改用 mysqlclient fork 的原因。在上述说明中将 mysqlclient 替换为 mysql-python 将允许我安装 mysqlclient 但问题不是在 virtualenv 中安装 mysqlclient 库,事实上 django 在它存在时似乎无法看到它。我浏览了这些说明,当我运行 manage.py reunserver 时,我仍然收到以下错误:django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module. Did you install mysqlclient?【参考方案3】:

从 python 3.7.4 降级到 python 3.6 为我在 Windows 10 上解决了这个问题。

【讨论】:

以上是关于新鲜的 python 3.7 / django 2.2.1 安装无法识别已安装 mysqlclient的主要内容,如果未能解决你的问题,请参考以下文章

django升级2.1python升级3.7时出现的错误:"trying to load '%s': %s" % (entry[1], e) django.temp

1-Django2.2安装指南

django_background_tasks 是不是支持 django 3 和 python 3.7?

阿里云CentOS8.0服务器配置Django3.0+Python 3.7 环境

加载 MySQLdb 模块时出错 - Windows 上的 Python 3.7

Django 1.8 和 Rest Framework 3.7 的“导入错误:没有名为 urls 的模块”