[PYTHON] Vorsichtsmaßnahmen bei Verwendung der Google Cloud-Bibliothek mit GAE / py

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)

Wie benutzt man

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))

Konflikt mit Appengine-Modul

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:

Problemumgehung

Fazit

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)
# ...

Inhalt

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)

Untersuchungsmethode

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.

Apropos

In Produktion

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.

Referenz

Ich habe nicht viel über PYTHONPATH- und .pth-Dateien verstanden, also habe ich viel gesucht. ..

Recommended Posts

Vorsichtsmaßnahmen bei Verwendung der Google Cloud-Bibliothek mit GAE / py
Vorsichtsmaßnahmen bei Verwendung von sechs mit Python 2.5
Vorsichtsmaßnahmen bei der Verwendung von Chainer
Vorsichtsmaßnahmen bei Verwendung von sqlite3 von macOS Sierra (10.12) mit Multiprocessing
Bei Verwendung von optparse mit iPython
Vorsichtsmaßnahmen bei der Verwendung der TextBlob-Merkmalsanalyse
Vorsichtsmaßnahmen bei der Installation von Tensorflow mit Anaconda
Vorsichtsmaßnahmen bei Verwendung der Funktion urllib.parse.quote
Vorsichtsmaßnahmen bei der Verwendung von Phantomjs aus Python
Bei Verwendung von MeCab mit virtualenv python
Zu beachtende Punkte bei der Lösung von DP-Problemen mit Python
Vorsichtsmaßnahmen bei Verwendung der for-Anweisung in Pandas
[Persönliches Memo] julia - Verwenden Sie die Python-Bibliothek mit julia unter Verwendung von PyCall
Über WARNUNG beim Verpacken mit Pyinstaller mit Pyocr
Vorsichtsmaßnahmen beim Umgang mit Kontrollstrukturen in Python 2.6
Geheime Schlüsselgenerierung bei Verwendung von EncryptedCookieStorage mit aiohttp_session
Vorsichtsmaßnahmen bei der Verwendung von tf.keras.layers.TimeDistributed für die benutzerdefinierte Ebene von tf.keras
[Webentwicklung mit Python] Vorsichtsmaßnahmen beim Speichern von Cookies
Was verwenden Sie beim Testen mit Python?
Stellen Sie GAE / py bereit
Rufen Sie mit Go mit cgo Ihre eigene C-Sprachbibliothek auf
Vorsichtsmaßnahmen bei der Installation eines hierarchischen Include-Verzeichnisses mit waf
Vorsichtsmaßnahmen beim Umgang mit ROS MultiArray in Python
Nutzung von Google Cloud Storage (GCS) durch "GAE / Py"
Bei der Verwendung von Tensorboard mit Pytorch ist ein Fehler aufgetreten
Wenn Sie den Union-Typ mit pydantic verwenden, ist es gut, ihn mit Literal zu kombinieren
Vorsichtsmaßnahmen bei der Berechnung mit Zeichenfolge für TmeStampType von PySpark
[Lösung] Wenn ich versuche, mit GAE eine Verbindung zu CloudSQL herzustellen, wird nur bei dev_appserver ein ImportError angezeigt.