Google App Engine SDK:配置不当:加载 MySQLdb 模块时出错:没有名为 _mysql 的模块

Posted

技术标签:

【中文标题】Google App Engine SDK:配置不当:加载 MySQLdb 模块时出错:没有名为 _mysql 的模块【英文标题】:Google App Engine SDK: ImproperlyConfigured: Error loading MySQLdb module: No module named _mysql 【发布时间】:2018-12-05 15:37:23 【问题描述】:

我正在尝试在以mysql 作为数据库的virtualenv 内的Google App Engine SDK(本地)上运行我的Django 应用程序。我的requirements.txt 文件中的所有内容都安装得很好。当我启动 Google App Engine SDK 环境时,它向我抛出了一个看起来很常见的令人讨厌的错误,但 Stack Overflow 还没有任何在 Google App Engine SDK 中解决此问题的示例。

这是我项目根目录的工作流程...

virtualenv venv && mkdir lib

source venv/bin/activate

pip install -r requirements.txt -t lib/ && pip install -r requirements.txt

当我运行以下命令启动 SDK 时......

dev_appserver.py app.yaml

我在回溯中收到以下错误...

File "/Users/username/Repositories/projectname/lib/django/db/utils.py", line 211, in __getitem__
backend = load_backend(db['ENGINE'])
File "/Users/username/Repositories/projectname/lib/django/db/utils.py", line 115, in load_backend
INFO     2018-06-26 20:09:30,812 module.py:846] default: "GET /_ah/start HTTP/1.1" 500 -
return import_module('%s.base' % backend_name)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/Users/username/Repositories/projectname/lib/django/db/backends/mysql/base.py", line 30, in <module>
'Did you install mysqlclient or MySQL-python?' % e
ImproperlyConfigured: Error loading MySQLdb module: No module named _mysql.
Did you install mysqlclient or MySQL-python?

我的要求.txt

Django==1.11.8
djangorestframework==3.8.2
facebook-sdk
oauth2client==2.0.1
google-api-python-client==1.6.2
facebookads==2.11.1
httplib2==0.10.3
enum==0.4.6
requests-toolbelt==0.8.0
google-cloud-storage==1.6.0
google-resumable-media==0.3.1
google-auth
requests==2.18.0
lxml==3.8.0
pycrypto==2.6.1
MySQL-python==1.2.5

lib/的内容

我也在 app.yaml 中调用 MySQLdb...

libraries:
- name: MySQLdb
  version: "latest"

appengine_config.py 的内容

# [START vendor]
from google.appengine.ext import vendor

vendor.add('lib')
# [END vendor]

我在调试时已从列表中核对了一些内容...

1) 我在虚拟环境中执行pip freeze 时会安装MySQL-python==1.2.5

2) MySQL 已安装并在我的本地计算机上完美运行。

3) 到目前为止,我已经浏览了 Stack Overflow 的大部分问题,但似乎都没有帮助。

【问题讨论】:

可以显示你requirements.txt的内容吗? @void 我的错,我实际上是在打电话给source venv/bin/activate,是的,它工作正常。 @void 因此,按照 GAE 的说明,您需要一个 lib 文件夹来保存所有相关库,尤其是当您部署到 Google Cloud 时。所以lib文件夹是必要的。事实上,我在我的 lib 文件夹和我的 venv 中都安装了所有依赖项。我不确定您所说的 PYTHONPATH 是什么意思。你能详细说明一下吗? @void 已将我的 appengine_config.py 文件添加到问题中。它绝对来自lib/ @ErikÅsland:不过我很好奇:为什么MySQLdb 在 requirements.txt 根本? GAE 通过app.yaml 中的libraries 条目为您提供MySQLdb 支持,对于本地开发,您将MySQLdb 安装到Python 库中(这是您用来创建GAE 项目的virtualenv 或全局站点包用于您的 Python 二进制文件)。见step 5 in the Google Cloud SQL documentation。 【参考方案1】:

安装是根据Google recommendations 设置的,它不包含可见的错误。该问题无法在外部环境中重现(类似的 Django 设置工作正常),所以我们找到了一个解决方法,请参见下面的(设置PYTHONPATH)。

GAE 要求将第三方库安装到lib/ 目录中,使其成为穷人的虚拟环境。然后通过在appengine_config.py 中调用vendor.add('lib')lib/ 添加到模块搜索路径中。

这在作者的设置中运行正常,因此 GAE 设法从 lib/django/ 导入 Django。然后这个工作配置在导入 MySQLdb 时莫名其妙地失败了,它肯定被安装到同一个 lib/ 中。

在调查期间,我们检查了PYTHONPATH 环境变量是否会影响任何事情的想法。它没有,但设置它解决了问题:

export PYTHONPATH=/Users/username/Repositories/projectname/lib/

注意:避免在类似 PATH 的环境变量中使用相对目录(Erik 评论中的./lib),这会造成安全漏洞。

【讨论】:

如果你在本地安装了mysqlclient,你可以像这样配置PYTHONPATH:C:\Python27\Lib\site-packages 所以,今天我回滚到 gcloud SDK 的 220 版本:gcloud components update --version 220.0.0,这个问题就消失了【参考方案2】:

作为 C 扩展的 MySQL-Python 可能会失败(没有名为 _mysql 的模块)。 你可以试试 pymysql 模块

【讨论】:

以上是关于Google App Engine SDK:配置不当:加载 MySQLdb 模块时出错:没有名为 _mysql 的模块的主要内容,如果未能解决你的问题,请参考以下文章

python 将Google App Engine SDK添加到Python virtualenv

OSX 上的 Google App Engine SDK 路径在哪里?

PayPal-Java-SDK 和 Google App Engine - 订阅反射错误

当我尝试在 Google App Engine SDK 上使用时,AssertionError 不断出现

通过 Google Cloud SDK 更新 App Engine 应用程序后无法启动它

如何通过 Google Drive 和 App Engine SDK 使用 Oauth2 服务帐户