在 gcloud “ImportError: No module named MySQLdb._mysql”上运行 dev_appserver.py 时出错?

Posted

技术标签:

【中文标题】在 gcloud “ImportError: No module named MySQLdb._mysql”上运行 dev_appserver.py 时出错?【英文标题】:Error when running dev_appserver.py on gcloud "ImportError: No module named MySQLdb._mysql"? 【发布时间】:2019-07-03 06:47:24 【问题描述】:

我正在尝试在 Google App Engine 上部署 Python-Flask 应用程序。该应用程序在没有 mysql 的情况下运行良好。在导入from flask_mysqldb import MySQL dev_appserver.py 时返回错误ImportError: No module named MySQLdb._mysql

我已经更新了 app.yaml 和 requirements.txt(也试过 MySQL-python,PyMySQL)

libraries:
- name: MySQLdb
  version: latest
Flask-MySQLdb==0.2.0
mysqlclient==1.4.1

ma​​in.py 的前几行

from flask import Flask, render_template, flash, redirect, url_for, session, logging, request
from flask_mysqldb import MySQL

app = Flask(__name__)

# Config MySQL
app.config['MYSQL_HOST'] = '35.236.72.247'
app.config['MYSQL_USER'] = <removed>
app.config['MYSQL_PASSWORD'] = <removed>
app.config['MYSQL_DB'] = 'myFlaskApp'
app.config['MYSQL_CURSORCLASS'] = 'DictCursor'

# Initialize MySQL
mysql = MySQL(app)

dev_appserver.py app.yaml 的终端转储

INFO     2019-02-09 01:13:00,098 devappserver2.py:278] Skipping SDK update check.
INFO     2019-02-09 01:13:00,172 api_server.py:275] Starting API server at: http://localhost:52922
INFO     2019-02-09 01:13:00,178 dispatcher.py:256] Starting module "default" running at: http://localhost:8080
INFO     2019-02-09 01:13:00,179 admin_server.py:150] Starting admin server at: http://localhost:8000
INFO     2019-02-09 01:13:02,374 instance.py:294] Instance PID: 28866
ERROR    2019-02-09 01:13:04,295 wsgi.py:263]
Traceback (most recent call last):
  File "/Users/zq/Desktop/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 240, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  File "/Users/zq/Desktop/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 299, in _LoadHandler
    handler, path, err = LoadObject(self._handler)
  File "/Users/zq/Desktop/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 85, in LoadObject
    obj = __import__(path[0])
  File "/Users/zq/Desktop/Python-Flask/main.py", line 3, in <module>
    from flask_mysqldb import MySQL
  File "/Users/zq/Desktop/Python-Flask/lib/flask_mysqldb/__init__.py", line 1, in <module>
    import MySQLdb
  File "/Users/zq/Desktop/Python-Flask/lib/MySQLdb/__init__.py", line 18, in <module>
    from . import _mysql
  File "/Users/zq/Desktop/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/python/runtime/sandbox.py", line 1097, in load_module
    raise ImportError('No module named %s' % fullname)
ImportError: No module named MySQLdb._mysql
INFO     2019-02-09 01:13:04,301 module.py:861] default: "GET / HTTP/1.1" 500 -

我该如何解决这个问题?或者,在我的烧瓶应用程序中使用 MySQL?该应用程序在我的系统上使用 MySQL 本地运行良好。

【问题讨论】:

你安装的是什么版本的mysqlclient?安装版本 1.4.1(删除 1.4.2) 你是对的。我重新安装了 mysqlclient 指定 pip mysqlclient==1.4.1 并且至少它现在检测到 mysql 模块。谢谢 现在的错误是:from MySQLdb import * AttributeError: 'module' object has no attribute 'NULL'。我会调查的 【参考方案1】:

git rm -f &lt;project-dir&gt;/lib/MySQLdb

gcloud app deploy

删除 lib/MysqlDB 并再次将其推送到谷歌云,它工作。显然,我的本地库与 AppEngine 的本机 mysqldb 冲突。

现在我只是省去了运行dev_appserver.py app.yaml

【讨论】:

【参考方案2】:

这只是对您在回答中提到的冲突的解释。

您在 GAE 应用程序中混合使用 3rd 方库的 2 个不同程序:

requesting a built-in/GAE-provided library(通过app.yaml 文件中的libraries 配置),在mysqldb 情况下,requires local system installation 也可用于本地开发服务器。

bundling your own library copy with your app(通过您的requirements.txt 文件)

您的回答中描述的操作删除了与您的应用捆绑在一起的库副本,这足以让 GAE 部署的应用正常工作。请注意,您没有提到:

requirements.txt 文件中删除库,如果不这样做,则意味着如果/在使用该文件重新执行lib 安装时,您将再次遇到问题 如果在本地运行没问题 - 即如果在本地系统上实际完成了所需的 mysqldb 安装

【讨论】:

这无论如何都会导致本地 devappserver 无法运行;该软件包是否仍应捆绑用于本地开发?我在本地遇到错误,但是如果我打包myslq-python 我会得到no module named _mysql 错误;顺便说一句,我通过 brew 进行了本地 mysql 安装。 @BrunoRipa。当您使用 GAE 提供的一个时,您需要本地安装来支持它,请参阅cloud.google.com/appengine/docs/standard/python/tools/…。但是您可能需要获得某个版本 - 与 GAE 提供的版本兼容。但我不确定——我不是 mysql 用户。

以上是关于在 gcloud “ImportError: No module named MySQLdb._mysql”上运行 dev_appserver.py 时出错?的主要内容,如果未能解决你的问题,请参考以下文章

Python中ImportError: No module named request

在 Heroku 但不是在本地出现错误“ImportError: No module named”

解决:python命令行运行出错 ImportError: No module named ...

ImportError: No module... 在 python setup.py install 之后

Python ImportError: No module named 'requests'解决方法

Python 之 ImportError: No module named ***