[PYTHON] Précautions lors de l'utilisation de la bibliothèque google-cloud avec GAE / py

Même si vous développez dans un environnement GAE / py, vous pouvez accéder à la banque de données d'autres projets, etc. Pour utiliser l'API RPC de Google Je pense qu'il y a des cas où vous souhaitez utiliser la bibliothèque google-cloud-python.

À ce moment-là, il y avait quelques points à noter concernant le chemin, alors notez-les.

google-cloud-python

Cette bibliothèque permet d'accéder à l'API GCP depuis GCE ou localement, Parce que vous n'utilisez pas C? , GAE / py fonctionne également.

Il s'appelait auparavant gcloud-python, mais vers septembre 2016, l'espace de noms a été renommé gcloud-> google.cloud. gcloud-python (J'écris cet article à cause de ce changement de nom)

Comment utiliser

Vous pouvez voir l'utilisation de base en regardant lire la documentation, Trouvez google-cloud ou le module que vous souhaitez utiliser à partir de pypi et installez-le avec pip.

$ pip install google-cloud-datastore

Après cela, le module sera développé sous google.cloud, afin que vous puissiez l'utiliser tel quel.

from google.cloud import datastore

client = datastore.Client()
product_key = client.key('Product', 123)
print(client.get(product_key))

Conflit avec le module appengine

Comme vous l'avez peut-être remarqué si vous lisez jusqu'ici, Dans GAE / py, importez le module appengine à partir de google.appengine et utilisez-le. Par conséquent, si vous installez google-cloud, Modules sous google dans l'environnement local virtualenv, Il sera écrasé par google-cloud à partir du SDK GAE.

À ce stade, si vous exécutez python sur virtualenv, Qu'il s'agisse de REPL ou d'exécution de fichiers comme unittest

>>> import google.appengine
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named appengine

J'obtiens une erreur comme celle-ci:

solution de contournement

Conclusion

Dans virtualenv lib / python2.7 / site-packages / _virtualenv_path_extensions.pth J'ai ajouté la logique d'ajout de module en ajoutant le chemin de la bibliothèque de google_appengine. Bien sûr, ce serait la même chose si vous l'ajoutiez à votre propre fichier .pth.

_virtualenv_path_extensions.pth


# ...Ci-dessous l'emplacement de python sdk/usr/local/google_valise Appengine
/usr/local/google_appengine
import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join('/usr/local/google_appengine', *('google',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('google', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('google', [os.path.dirname(p)])));m = m or not has_mfs and sys.modules.setdefault('google', types.ModuleType('google'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p)
# ...

Contenu

Comme il est difficile de lire sur une seule ligne, insérez un saut de ligne pour voir le contenu. Depuis que j'ai apporté la description d'autres bibliothèques de google, il y a aussi une description de la correspondance 3.5, mais GAE / py est la série 2.7, donc je pense qu'il peut être supprimé.

import sys, types, os
has_mfs = sys.version_info > (3, 5) 
# google_Créez un chemin pour le module google dans l'appengine
p = os.path.join('/usr/local/google_appengine', *('google',))

#Extraire l'objet Module
# 3.5 cas
importlib = has_mfs and __import__('importlib.util')
has_mfs and __import__('importlib.machinery')
m = has_mfs and sys.modules.setdefault('google', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('google', [os.path.dirname(p)])))
# 2.7 cas
m = m or not has_mfs and sys.modules.setdefault('google', types.ModuleType('google'))
mp = (m or []) and m.__dict__.setdefault('__path__',[])
#Ajouter un chemin au module
(p not in mp) and mp.append(p)

Méthode d'enquête

C'est une enquête ou une référence. ..

Ajout de plusieurs modules au même espace de noms sans python Je ne pense pas que ce soit très bienvenu. J'ai donc pensé qu'il serait difficile de le résoudre.

Cependant, si vous regardez de plus près la bibliothèque google-cloud, Les packages pour plusieurs pypi sont installés. Et ils sont ajoutés sous les modules google et google.cloud. J'ai pensé que je pouvais réparer le chemin de la même manière, alors j'ai cherché le fichier .pth et j'ai trouvé la réponse.

Je ne comprends pas vraiment le style des fichiers .pth,

Au fait

En production

Il semble que les mesures ci-dessus ne peuvent pas être ajoutées à GAE / py, Lorsque je l'ai déployé, les deux modules ont été correctement ajoutés au module google. Comme prévu. (Je veux que vous distribuiez appengine sdk avec pypi comme la bibliothèque google-cloud)

nose De plus, il y avait une erreur avec python -m unittest discover etc. Quand j'exécute nosetests, le test se termine sans aucun problème.

En effet, la bibliothèque de nez enveloppe le test unitaire avant d'exécuter le test Cela semblait être parce que je modifiais PYTHONPATH.

Dans CircleCI, le testeur est le nez par défaut J'étais en retard pour réaliser que le conflit de chemin n'était pas résolu parce que le test avait réussi. Je pense qu'il n'y a pas de problème si vous faites des tests localement C'est un problème lors du débogage avec REPL etc., donc je pense qu'il devrait être résolu.

référence

Je ne comprenais pas grand-chose aux fichiers PYTHONPATH et .pth, donc j'ai beaucoup cherché. ..

Recommended Posts

Précautions lors de l'utilisation de la bibliothèque google-cloud avec GAE / py
Précautions lors de l'utilisation de six avec Python 2.5
Précautions lors de l'utilisation de Chainer
Précautions lors de l'utilisation de sqlite3 de macOS Sierra (10.12) avec le multitraitement
Lors de l'utilisation d'optparse avec iPython
Précautions lors de l'utilisation de l'analyse des traits TextBlob
Précautions lors de l'installation de tensorflow avec anaconda
Précautions lors de l'utilisation de la fonction urllib.parse.quote
Précautions lors de l'utilisation de phantomjs de python
Lors de l'utilisation de MeCab avec python dans virtualenv
Points à noter lors de la résolution de problèmes DP avec Python
Précautions lors de l'utilisation de l'instruction for dans les pandas
[Personal memo] julia --Utiliser la bibliothèque Python avec Julia en utilisant PyCall
À propos de AVERTISSEMENT lors de l'empaquetage avec pyinstaller en utilisant pyocr
Précautions lors du traitement des structures de contrôle dans Python 2.6
Génération de clé secrète lors de l'utilisation d'EncryptedCookieStorage avec aiohttp_session
Précautions lors de l'utilisation de tf.keras.layers.TimeDistributed pour la couche personnalisée tf.keras
[Développement Web avec Python] Précautions lors de l'enregistrement des cookies
Qu'utilisez-vous lorsque vous testez avec Python?
Déployer GAE / py
Appelez votre propre bibliothèque de langage C avec Go en utilisant cgo
Précautions lors de l'installation d'un répertoire d'inclusion hiérarchique avec waf
Précautions lors du traitement du type ROS MultiArray en Python
Utilisation de Google Cloud Storage (GCS) par "GAE / Py"
J'ai eu une erreur lors de l'utilisation de Tensorboard avec Pytorch
Lorsque vous utilisez le type Union avec pydantic, il est bon de le combiner avec Literal
Précautions lors du calcul avec une chaîne pour TmeStampType de PySpark
[Solution] Lorsque j'essaye de me connecter à CloudSQL avec GAE, j'obtiens une ImportError uniquement lorsque dev_appserver.