Selbst wenn Sie in einer GAE / py-Umgebung entwickeln, können Sie auf den Datenspeicher anderer Projekte usw. zugreifen. So verwenden Sie die RPC-API von Google Ich denke, es gibt Fälle, in denen Sie die Google-Cloud-Python-Bibliothek verwenden möchten.
Zu dieser Zeit gab es einige Punkte, die in Bezug auf den Pfad zu beachten waren. Notieren Sie sich diese.
google-cloud-python
Diese Bibliothek dient zum Aufrufen der GCP-API von GCE oder lokal. Weil Sie C nicht verwenden? , GAE / py funktioniert auch.
Früher hieß es gcloud-python, aber um September 2016 wurde der Namespace in gcloud-> google.cloud umbenannt. gcloud-python (Ich schreibe diesen Artikel wegen dieser Umbenennung)
Sie können die grundlegende Verwendung sehen, indem Sie die Dokumente lesen. Suchen Sie in pypi nach Google-Cloud oder dem Modul, das Sie verwenden möchten, und installieren Sie es mit pip.
$ pip install google-cloud-datastore
Danach wird das Modul unter google.cloud erweitert, sodass Sie es so verwenden können, wie es ist.
from google.cloud import datastore
client = datastore.Client()
product_key = client.key('Product', 123)
print(client.get(product_key))
Wie Sie vielleicht bemerkt haben, wenn Sie so weit gelesen haben, Importieren Sie in GAE / py das Appengine-Modul unter google.appengine und verwenden Sie es. Wenn Sie also Google-Cloud installieren, Module unter Google in der lokalen virtuellen Umgebung, Es wird von Google Cloud aus dem GAE SDK überschrieben.
Wenn Sie zu diesem Zeitpunkt Python auf virtualenv ausführen, Ob es sich um REPL oder um die Ausführung von Dateien wie unittest handelt,
>>> import google.appengine
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named appengine
Ich erhalte folgende Fehlermeldung:
In virtualenv lib / python2.7 / site-packages / _virtualenv_path_extensions.pth
Ich habe die Moduladditionslogik hinzugefügt, während ich den Pfad der Bibliothek von google_appengine hinzugefügt habe.
Natürlich wäre es dasselbe, wenn Sie es Ihrer eigenen .pth-Datei hinzufügen würden.
_virtualenv_path_extensions.pth
# ...Unten ist die Position von Python SDK/usr/local/google_Appengine Fall
/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)
# ...
Fügen Sie einen Zeilenumbruch ein, um den Inhalt anzuzeigen, da das Lesen in einer Zeile schwierig ist. Da ich die Beschreibung anderer Google-Bibliotheken mitgebracht habe, gibt es aber auch eine Beschreibung der 3.5-Korrespondenz GAE / py ist eine 2.7-Serie, daher denke ich, dass es abgekratzt werden kann.
import sys, types, os
has_mfs = sys.version_info > (3, 5)
# google_Erstellen Sie einen Pfad für das Google-Modul in der Appengine
p = os.path.join('/usr/local/google_appengine', *('google',))
#Extrahieren Sie das Modulobjekt
# 3.5 Fälle
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 Fälle
m = m or not has_mfs and sys.modules.setdefault('google', types.ModuleType('google'))
mp = (m or []) and m.__dict__.setdefault('__path__',[])
#Pfad zum Modul hinzufügen
(p not in mp) and mp.append(p)
Es ist eine Umfrage oder eine Referenz. ..
Hinzufügen mehrerer Module zum gleichen Namespace ohne Python Ich denke nicht, dass es sehr willkommen ist. Also dachte ich, es wäre schwierig, es zu lösen.
Wenn Sie sich jedoch die Google Cloud-Bibliothek genauer ansehen, Pakete für mehrere Pypi sind installiert. Und sie werden unter den Modulen google und google.cloud hinzugefügt. Ich dachte, ich könnte den Pfad auf die gleiche Weise reparieren, also suchte ich nach der .pth-Datei und fand die Antwort.
Ich verstehe den Stil von .pth-Dateien nicht wirklich.
Es scheint, dass die oben genannten Maßnahmen nicht zu GAE / py hinzugefügt werden können. Bei der Bereitstellung wurden beide Module ordnungsgemäß zum Google-Modul hinzugefügt. Wie erwartet. (Ich möchte, dass Sie Appengine SDK mit Pypi wie der Google Cloud-Bibliothek vertreiben.)
nose Es gab auch einen Fehler mit "Python -m unittest entdecken" usw. Wenn ich "Nosetests" durchführe, wird der Test ohne Probleme abgeschlossen.
Dies liegt daran, dass die Nasenbibliothek die unittest umschließt, bevor der Test ausgeführt wird Es schien zu sein, weil ich PYTHONPATH modifizierte.
In CircleCI ist der Testläufer standardmäßig die Nase Ich habe zu spät festgestellt, dass der Pfadkonflikt nicht gelöst wurde, da der Test erfolgreich bestanden wurde. Ich denke, dass es kein Problem gibt, wenn Sie Nosetests lokal durchführen. Es ist ein Problem beim Debuggen mit REPL usw., daher denke ich, dass es gelöst werden sollte.
Ich habe nicht viel über PYTHONPATH- und .pth-Dateien verstanden, also habe ich viel gesucht. ..
Recommended Posts