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)
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))
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:
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)
# ...
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)
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,
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.
Je ne comprenais pas grand-chose aux fichiers PYTHONPATH et .pth, donc j'ai beaucoup cherché. ..
Recommended Posts