[PYTHON] [Solution] Lorsque j'essaye de me connecter à CloudSQL avec GAE, j'obtiens une ImportError uniquement lorsque dev_appserver.

Je suis accro à l'utilisation de Google App Engine (Python) pour mes recherches. Je développe un service Web en utilisant Flask avec GAE + CloudSQL, et lorsque j'essaie de me connecter à CloudSQL depuis Flask en utilisant SQLAlchemy, j'obtiens une erreur. Apparemment, j'obtiens une erreur ʻImportError: No module name _mysql en essayant d'importer MySQLdb. De plus, cette erreur ne se produit que lorsque vous essayez de vérifier le comportement localement avec dev_appserver.py`.

Le journal des erreurs est le suivant. (Une erreur se produit lorsque sqlalchemy.create_engine () est exécuté lors de l'accès à / user)

$ dev_appserver.py app.yaml                                                                             
INFO     2017-07-27 05:57:06,227 sdk_update_checker.py:231] Checking for updates to the SDK.
INFO     2017-07-27 05:57:06,541 api_server.py:297] Starting API server at: http://localhost:52746
INFO     2017-07-27 05:57:06,545 dispatcher.py:209] Starting module "test" running at: http://localhost:8080
INFO     2017-07-27 05:57:06,548 admin_server.py:116] Starting admin server at: http://localhost:8000
WARNING  2017-07-27 05:57:06,548 devappserver2.py:187] No default module found. Ignoring.
INFO     2017-07-27 05:57:17,859 server.py:125] Server initialized for threading.
ERROR    2017-07-27 05:57:17,875 wsgi.py:263] 
Traceback (most recent call last):
  File "/Users/test/Desktop/study/gae/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/test/Desktop/study/gae/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 299, in _LoadHandler
    handler, path, err = LoadObject(self._handler)
  File "/Users/test/Desktop/study/gae/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 85, in LoadObject
    obj = __import__(path[0])
  File "/Users/test/Desktop/test/test/main.py", line 30, in <module>
    engine = create_engine(url, echo=True)
  File "/Users/test/Desktop/test/test/lib/sqlalchemy/engine/__init__.py", line 387, in create_engine
    return strategy.create(*args, **kwargs)
  File "/Users/test/Desktop/test/test/lib/sqlalchemy/engine/strategies.py", line 80, in create
    dbapi = dialect_cls.dbapi(**dbapi_args)
  File "/Users/test/Desktop/test/test/lib/sqlalchemy/dialects/mysql/mysqldb.py", line 110, in dbapi
    return __import__('MySQLdb')
  File "/Users/test/Desktop/test/test/lib/MySQLdb/__init__.py", line 19, in <module>
    import _mysql
  File "/Users/test/Desktop/study/gae/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/python/sandbox.py", line 1024, in load_module
    raise ImportError('No module named %s' % fullname)
ImportError: No module named _mysql
INFO     2017-07-27 05:57:17,882 module.py:809] test: "GET /user HTTP/1.1" 500 -

(* Remplacez la partie que vous souhaitez garder secrète par test)

ʻApp.yaml et ʻappengine_config.py sont les suivants.

app.yaml


module: test
runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: .*
  script: main.app

libraries:
- name: MySQLdb
  version: "1.2.5"

appengine_config.py


from google.appengine.ext import vendor

# Add any libraries install in the "lib" folder.
vendor.add('lib')

Les bibliothèques s'installent dans le répertoire lib.

requirements.txt


Flask==0.10.1
Flask_SocketIO
itsdangerous==0.24
Jinja2==2.7.3
MarkupSafe==0.23
python-engineio
python-socketio
six==1.9.0
Werkzeug==0.10.4
sqlalchemy==1.1.9
mysql-python==1.2.5
$ sudo pip install -t lib -r requirements.txt

En guise de test, j'ai importé MySQLdb dans mon Python local et je n'ai eu aucune erreur.

Python 2.7.9 (default, May  9 2017, 14:55:04) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
>>> 

En guise d'essai supplémentaire, lorsque je l'ai monté dans l'environnement GAE en tant que version dev, il a été déployé sans problème, J'ai pu confirmer la connexion à CloudSQL sans aucun problème.

$ appcfg.py -A test-project -V dev update app.yaml
03:15 PM Host: appengine.google.com
03:15 PM Application: test-project (was: None); module: test; version: dev (was: None)
03:15 PM Starting update of app: test-project, module: test, version: dev
03:15 PM Getting current resource limits.
03:15 PM Scanning files on local disk.
03:15 PM Scanned 500 files.
03:15 PM Cloning 544 application files.
03:15 PM Compilation starting.
03:16 PM Compilation completed.
03:16 PM Starting deployment.
03:16 PM Checking if deployment succeeded.
03:16 PM Deployment successful.
03:16 PM Checking if updated app version is serving.
03:16 PM Completed update of app: test-project, module: test, version: dev
$

_mysql est perdu uniquement lorsqu'il est déployé dans l'environnement local avec dev_appserver.py.

Nous continuerons à résoudre le problème. (C'est pénible si vous ne pouvez pas vérifier le comportement de css ou js localement)


(Ajout: 2017/07/27 18:50)

_mysql est perdu uniquement lorsqu'il est déployé dans l'environnement local avec dev_appserver.py.

Quand j'ai contourné cela, je suis tombé sur le stackoverflow suivant.

google app engine - how to add lib folder?

appengine_config.py will run in the GAE environment or when you run dev_appserver, which emulates the GAE environment. However if you're ever running outside of a GAE environment, make sure your PYTHONPATH includes the lib folder you want to import from.

En d'autres termes, ʻappengine_config.py n'est pas exécuté lorsque dev_appserver.pyest exécuté localement, alors ajoutez le répertoirelib à PYTHONPATH`.

En fait, définissez PYTHONPATH exactement tel quel

$ export PYTHONPATH=/Users/test/Desktop/test/test/lib:$PYTHONPATH

Cela a fonctionné quand je l'ai exécuté.

(Après cela, j'ai lu la documentation officielle, mais je n'ai rien trouvé qui indique clairement la relation entre dev_appserver.py et ʻappengine_config.py` ... orz)

Je suis content de l'avoir résolu pour le moment. Les problèmes peuvent être résolus en les résumant en phrases.

Recommended Posts

[Solution] Lorsque j'essaye de me connecter à CloudSQL avec GAE, j'obtiens une ImportError uniquement lorsque dev_appserver.
J'obtiens une erreur lorsque j'essaie d'élever Python à la série 3 en utilisant pyenv dans Catalina
J'obtiens une erreur en essayant d'installer maec 4.0.1.0 avec pip
J'obtiens un UnicodeDecodeError en essayant de me connecter à oracle avec python sqlalchemy
J'ai essayé d'obtenir une AMI en utilisant AWS Lambda
J'ai eu une erreur lors de l'utilisation de Tensorboard avec Pytorch
Quand j'essaye d'installer mysqlclient avec Django, j'obtiens l'erreur: la commande 'gcc' a échoué avec l'état de sortie 1.
Quand j'essaye de pousser avec heroku, ça ne marche pas
J'obtiens [Erreur 2055] en essayant de me connecter à MySQL avec Heroku
Lorsque j'essaye de me connecter à MySQL avec mysql-connector-python, je ne peux pas me connecter avec l'erreur "Erreur de connexion SSL: SSL_CTX_set_tmp_dh a échoué"
Un mémorandum lors de l'acquisition automatique avec du sélénium
Quand j'obtiens une erreur avec Pylint sur Windows Atom
Lorsque vous souhaitez envoyer un objet avec des requêtes à l'aide de flask
J'obtiens une ImportError dans appengine_config.py
Essayez d'obtenir des statistiques en utilisant e-Stat
J'ai eu une erreur en essayant d'installer Xgboost et sa solution
Je souhaite créer un profil utilisateur Ubuntu Chrome avec Colab uniquement
Quand je retourne en utilisant le chainer, ça va un peu
Essayez de piquer la base de données sur IBM i avec python + JDBC à l'aide de JayDeBeApi
J'obtiens une erreur avec les pandas d'importation.
J'ai essayé de commencer avec Hy
Essayez de générer une image avec aliénation
Lorsque j'essaye de connecter django et postgresql avec Docker, j'obtiens l'erreur "django.db.utils.OperationalError: impossible de traduire le nom d'hôte" db "en adresse: Nom ou service inconnu"
Solution de contournement si vous obtenez une erreur lors de la tentative d'installation de PySide avec pip
Trois choses auxquelles j'étais accro lors de l'utilisation de Python et MySQL avec Docker
Lorsque je me suis connecté à un serveur Jupyter distant avec VScode, il était distant mais local.
Que faire si vous obtenez une erreur lors de l'installation de python avec pyenv
Lorsque j'essaye d'utiliser le notebook Jupiter sur Mac, je ne peux sélectionner que python2
J'ai essayé de créer un environnement à vérifier régulièrement en utilisant Selenium avec AWS Fargate
J'ai eu une erreur lors de l'enregistrement avec OpenCV
J'ai essayé d'obtenir une image en grattant
Je veux être OREMO avec setParam!
J'ai essayé d'obtenir des données CloudWatch avec Python
J'obtiens une UnicodeDecodeError lors de l'exécution avec mod_wsgi
Précautions lors de l'utilisation de la bibliothèque google-cloud avec GAE / py
J'ai essayé de détecter un objet avec M2Det!
Essayez de créer un serveur HTTP en utilisant Node.js
J'obtiens une erreur avec toutes les commandes yum
[Python] Je souhaite utiliser uniquement l'index lors de la mise en boucle d'une liste avec une instruction for
Que faire si vous obtenez une erreur OpenSSL lors de l'installation de Python 2 avec pyenv
Chaque fois que j'essaye de lire un fichier csv en utilisant des pandas, j'obtiens une erreur numpy.
Lorsque j'essaye d'importer des pandas sur macOS, j'obtiens l'erreur No module named'_bz2 '
Je souhaite envoyer un message d'erreur en japonais avec le formulaire de changement de mot de passe django
Que faire si vous obtenez une erreur d'importation lors de l'importation de matplotlib avec Jupyter
Je souhaite extraire uniquement les pods avec l'étiquette spécifiée à l'aide du sélecteur d'étiquettes dans Client-go
Lorsque j'essaye de mettre à jour les données sur DynamoDB avec Python (boto3), j'obtiens "ExpressionAttributeNames contient une clé invalide: Erreur de syntaxe; clé: <nom de clé>"