MySQLdb 和 Python ImportError
Posted
技术标签:
【中文标题】MySQLdb 和 Python ImportError【英文标题】:MySQLdb and Python ImportError 【发布时间】:2015-01-20 07:00:54 【问题描述】:我这辈子都想不通。我整天都在网上搜索,所有资源似乎都已经过时了。据我所知,让 mysqldb 和 Python 一起玩得很好是相当困难的。我已经尽我所能,但我不确定如何继续前进。
首先,我正在运行 Python 2.7
当我尝试在实时解释器中运行“import MySQLdb”时遇到的错误是:
ImportError: this is MySQLdb version (1, 2, 2, 'final', 0), but _mysql is version (1, 2, 5, 'final', 1)
当我运行“pip install mysql-python”时,我还会看到以下错误日志,但是我不确定这是否与版本不匹配有关。 http://pastebin.com/hqVv6aPZ
我有一个依赖于 MySQLdb 的 python 项目,我一直在尝试获取运行 Python 的 virtualenv 以正确安装包。这就是我所做的:
我已经从源代码构建了 MySQL,以确保我的机器上有一个 64 位兼容版本的 MySQL。我使用了 --universal 标志来确保这一点。 我已验证我也在运行 64 位版本的 Python。 MySQL 来自 Homebrew mysql-python 来自 pip我一辈子都想不通在这里做什么。我的机器上似乎只有 MySQLdb 和 _mysql 之间的版本不匹配。是这样吗?如果是这样,解决方案是否只是重新安装旧版本的 MySQL?看来,当我强制 pip 安装 mysql-python 的 1.2.5 版本时,它会安装 MySQLdb 的 1.2.2 版本,所以我不知道在这里做什么,因为我不确定自制软件中的哪个包实际上与_mysql 版本 1.2.5。
编辑 -
系统路径
'/Users/XXXXXXXXXXX/virtualenvs/qa-automated-tests/lib/python27.zip',
'/Users/XXXXXXXXXXX/virtualenvs/qa-automated-tests/lib/python2.7',
'/Users/XXXXXXXXXXX/virtualenvs/qa-automated-tests/lib/python2.7/plat-darwin',
'/Users/XXXXXXXXXXX/virtualenvs/qa-automated-tests/lib/python2.7/plat-mac',
'/Users/XXXXXXXXXXX/virtualenvs/qa-automated-tests/lib/python2.7/plat-mac/lib-scriptpackages', '/Users/XXXXXXXXXXX/virtualenvs/qa-automated-tests/Extras/lib/python',
'/Users/XXXXXXXXXXX/virtualenvs/qa-automated-tests/lib/python2.7/lib-tk',
'/Users/XXXXXXXXXXX/virtualenvs/qa-automated-tests/lib/python2.7/lib-old',
'/Users/XXXXXXXXXXX/virtualenvs/qa-automated-tests/lib/python2.7/lib-dynload',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
'/Users/adam.stark/virtualenvs/qa-automated-tests/lib/python2.7/site-packages'
Python --version 表示我使用的是 2.7.5 版。我还将 pastebin 设置为 public。我只是不确定该转储中的相关信息到底是什么,它会返回 16 个错误。
【问题讨论】:
不管怎样,你运行的是苹果预装的 Python 吗?自制Python?不同的 Python,比如 python.org 二进制安装程序? shell 中的which python
和which pip
显示什么? Python 中的import sys; print sys.executable, sys.path
呢?
另外,_mysql
不是 MySQL 的一部分,它是 MySQLdb 的一部分。不知何故,你得到了 MySQLdb 1.2.2.0 的一部分和 1.2.5.1 的一部分。我的猜测是(a)您的系统站点包中有 1.2.2.0,然后您将 1.2.5.1 安装到您的虚拟环境中,但它只安装了部分,或者(b)您不知何故有两个不同的 Python 2.7 安装共享其站点包的一部分,并且 PATH 上的第一个 pip
和第一个 python
来自不同的 Python 安装。
这些日志中根本没有错误。有一堆警告,它们是 MySQLdb 应该在某些时候修复或解决的潜在 64 位错误,但它们在这里不相关。最后你可以看到它能够毫无问题地链接_mysql.so
,然后它说“成功安装MySQL-python”。
同时,您还没有回答我最重要的问题:您运行的是预装的 Apple Python、Homebrew Python 还是其他什么? which python
来自 外部,virtualenv 会告诉你这一点,但不会来自内部。
好的,哪个 OS X 版本?从(我认为)10.8 开始,Apple 改变了他们分发内置额外电池的方式,有时尝试更新它们并不能正常工作。我知道他们不会在 10.9 中分发 MySQLdb(因为我现在在 10.9 的机器上),但我不知道是 10.8 还是 10.10……我知道这可能 不是你的问题,但最好排除它。
【参考方案1】:
这里的问题最终是几件事。正如 abarnert 在问题的 cmets 中指出的那样,系统 python 和 virtualenv python 混合在一起。为了解决这个问题,我必须将 PyDev 项目的项目属性更改为仅指向 virtualenv python 实例,然后在 PyDev 解释器首选项中我必须重建 PYTHONPATH。
完成此操作后,我必须在 virtualenv 中运行以下代码:
pip uninstall mysql-python
pip install mysql-python==1.2.5
这解决了所有问题。
【讨论】:
你是如何重建python路径的? 如果我想使用更新的 mysql-python 怎么办?but _mysql is version (1, 2, 5, 'final', 1)
,_mysql
对应的包是什么?是否可以更新/升级 _mysql
?【参考方案2】:
你可以试试这个。打开终端并输入:
sudo apt-get remove python-mysqldb
sudo apt-get install python-dev libmysqlclient-dev
git clone https://github.com/farcepest/MySQLdb1.git
python setup.py build
sudo python setup.py install
它对我有用。我使用 Python 2
【讨论】:
【参考方案3】:我遇到了同样的问题,但出于不同的原因。我在我的工作机器(大学基础设施的一部分)上没有 root 权限。我必须通过发出在本地安装 MySQLdb
pip install --user MySQL-python
(来自这个guide)。这产生了相同的
ImportError: this is MySQLdb version (1, 2, 3, 'final', 0), but _mysql is version (1, 2, 5, 'final', 1)
不匹配。无法安装 1.2.5 版。
我做了什么:从 本地 卸载并重新安装版本 1.2.3,如错误所示
pip install --user MySQL-python==1.2.3
错误消失了。
【讨论】:
以上是在 Python 2.7 上测试的【参考方案4】:执行此操作,然后重试
pip uninstall mysqlclient
【讨论】:
以上是关于MySQLdb 和 Python ImportError的主要内容,如果未能解决你的问题,请参考以下文章
python导入(MySQLdb)和apache python_egg_cache的问题