Der Schmerz von gRPC mit Python. November 2019. (Persönliches Memo)

Es mag in der gRPC-Welt normal sein, aber ich werde feststellen, dass ein Anfänger unerwartet süchtig danach war, einen gRPC-Client in Python zu schreiben.

Arbeiten Sie basierend auf Python Quick Start. Laden Sie zunächst den Beispielcode herunter. Verwenden Sie jetzt die etwas ältere Version 1.19.0 anstelle der neuesten Version 1.25.0. Der Grund wird später beschrieben.

git clone -b v1.19.0 https://github.com/grpc/grpc

Lassen Sie uns den Geschmack des Dokuments ändern und ein Python-Projekt in einem anderen Verzeichnis erstellen. Wieder werden wir v1.19.0 verwenden.

mkdir python-grpc
cd python-grpc
pipenv --python 3.7
pipenv install grpcio~=1.19.0
pipenv install --dev grpcio-tools
pipenv shell
mkdir pb

Würzig 1: Die Option grpc_tools.protoc ist schwierig.

Erstellen Sie mit dem Befehl grpc_tools.protoc einen py aus der Protodatei und schreiben Sie ihn in das Verzeichnis pb.

python -m grpc_tools.protoc \
    -I../grpc/examples/protos/ \
    --python_out=pb \
    --grpc_python_out=pb \
    ../grpc/examples/protos/helloworld.proto

Zunächst ist die Option -I erforderlich. Andernfalls wird die Fehlermeldung "Datei befindet sich nicht in einem mit --proto_path (oder -I) angegebenen Pfad" angezeigt. Es ist unvernünftig, warum ich es nicht finden kann, weil ich die Position des Protos richtig angegeben habe.

Die Option -I hat auch einen Trick: Wenn Sie ein Verzeichnis höherer Ebene angeben, z. B. "-I ../grpc/beispiele/", wird die Datei in "pb / protos" anstelle von "pb" generiert. Wenn Sie nicht wissen, wissen Sie nicht, wohin die Datei gegangen ist.

In der Beschreibung der Option "--help" wird der Unterschied zwischen "--python_out" und "--grpc_python_out" nicht erwähnt. Obwohl es Unterschiede gibt, wie oben beschrieben, ist es nicht zumutbar, eine andere Option zu haben, da es nicht ausreicht, den Import nur dann fehlzuschlagen, wenn Sie ihn in ein anderes Verzeichnis stellen.

Spicy 2: Die generierte Datei hat keinen relativen Pfad.

Wenn ich versuche, die von Python erstellte zu lesen, wird eine Fehlermeldung angezeigt.

$ python
>>> import pb.helloworld_pb2_grpc
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/tyamamiya/tmp/python-grpc/pb/helloworld_pb2_grpc.py", line 4, in <module>
    import helloworld_pb2 as helloworld__pb2
ModuleNotFoundError: No module named 'helloworld_pb2'

Der relative Pfad des generierten Codes ist falsch (es scheint Python2-Stil zu sein). Es gibt keine Hilfe dafür, also fügen Sie "pb / __ init __. Py" gemäß [Python: Relative Importe in generierten Modulen verwenden] hinzu (https://github.com/protocolbuffers/protobuf/issues/1491#issuecomment-547504972).

import sys
from pathlib import Path

sys.path.append(str(Path(__file__).parent))

Tipp: So debuggen Sie

Wenn es nicht funktioniert, weil keine Fehler vorliegen, ist es besser, Umgebungsvariablen festzulegen und auszuführen. Starten Sie nun den Server und den Client und überprüfen Sie den Vorgang.

$ python ../grpc/examples/python/helloworld/greeter_server.py & 
$ export GRPC_TRACE=all
$ export GRPC_VERBOSITY=DEBUG
$ python ../grpc/examples/python/helloworld/greeter_client.py
...Viele Dinge kommen heraus.
Greeter client received: Hello, you!
$ unset GRPC_TRACE
$ unset GRPC_VERBOSITY

Gut.

Spicy 3: google.api

Gelegentlich gibt es eine Protodatei, die google.api enthält. Die Protodatei selbst befindet sich unter https://github.com/googleapis/googleapis/tree/master/google/api. Sie können sie also herunterladen und mit "-I" angeben, aber ich habe sie in den konvertierten Code aufgenommen. Der Inhalt von Proto ist nicht enthalten. Ich hatte das Gefühl, dass es mit der Option "--include_imports" importiert werden würde, aber das ist nicht der Fall, und ich muss das konvertierte separat installieren.

pipenv install googleapis-common-protos

Nun, wenn Sie das wissen, spielt es keine Rolle.

Spicy 4: fehlende ausgewählte ALPN-Eigenschaft.

Wenn Sie mit TLS mit der neuesten Python-grpcio-Bibliothek eine Verbindung zu einem vorhandenen gRPC-Server herstellen, wird möglicherweise die ausgewählte ALPN-Eigenschaft "fehlen" angezeigt.

D1125 19:20:57.313482000 4619453888 security_handshaker.cc:186]        Security handshake failed: {"created":"@1574677257.313465000","description":"Cannot check peer: missing selected ALPN property.","file":"src/core/lib/security/security_connector/ssl_utils.cc","file_line":118}
I1125 19:20:57.313703000 4619453888 subchannel.cc:1000]                Connect failed: {"created":"@1574677257.313465000","description":"Cannot check peer: missing selected ALPN property.","file":"src/core/lib/security/security_connector/ssl_utils.cc","file_line":118}

Sie können verschiedene interessante Fakten finden, indem Sie mit diesem Schlüsselwort suchen. Unter https://github.com/grpc/grpc/issues/18710 können Sie jedoch anscheinend nicht auf den Server zugreifen, der die ALPN-Überprüfungsfunktion nicht unterstützt.

Es kann nicht geholfen werden, also verwenden Sie die alte Version v1.19.0, um den Tee schlammig zu machen. https://stackoverflow.com/questions/57397723/grpc-client-failing-to-connect-to-server-with-tls-certificates

Fazit

Die Kombination von Python und gRPC scheint unbekannt zu sein.

Recommended Posts

Der Schmerz von gRPC mit Python. November 2019. (Persönliches Memo)
[Persönliches Memo] julia - Verwenden Sie die Python-Bibliothek mit julia unter Verwendung von PyCall
Versuchen Sie es mit dem Sammlungsmodul (ChainMap) von python3
Rufen Sie das Aktualisierungsdatum der Python-Memorandum-Datei ab.
Schneiden Sie einen Teil der Zeichenfolge mit einem Python-Slice aus
Erläuterung des Konzepts der Regressionsanalyse mit Python Teil 1
Erläuterung des Konzepts der Regressionsanalyse mit Python Extra 1
Studie aus Python Hour8: Verwenden von Paketen
Ssh-Verbindungsnotiz mit ProxyCommand von ssh_config in Python
Auf dem Weg zum Ruhestand von Python2
[Persönliches Memo] Automatischer Abschluss der Bash
Python: Grundlagen der Verwendung von Scikit-Learn ①
Python-Memo mit Perl --join
Über die Funktionen von Python
Die Kraft der Pandas: Python
[Memo] Das Geheimnis kumulativer Zuweisungsanweisungen in Python-Funktionen
Anzeigen mit dem Python-Modul des mobilen Nifty Cloud-Backends
Ein Memo, dass ich eine Grundfunktion in Python mit Wiederholung geschrieben habe
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Die Geschichte von Python und die Geschichte von NaN
Bilderfassung von Firefox mit Python
[Python] Der Stolperstein des Imports
Erster Python 3 ~ Der Beginn der Wiederholung ~
[Python] Ich habe die Route des Taifuns mit Folium auf die Karte geschrieben
[Persönliches Memo] Python-Memo für virtuelle Umgebungen
Bestätigung der Impulsantwort (persönliches Memo)
Trübungsentfernung mit Python detailEnhanceFilter
[Python] LINE-Benachrichtigung über die neuesten Informationen mithilfe der automatischen Suche von Twitter
pyenv-change die Python-Version von virtualenv
"Python Startbook" Python3-kompatibles Memo
[Python] Die potenzielle Feldplanung von Python Robotics verstehen
Überprüfung der Grundlagen von Python (FizzBuzz)
[Persönliches Memo] Python-Sequenztyp / Zuordnungstyp
Implementierung von Desktop-Benachrichtigungen mit Python
Rufen Sie den Wert des Dropdown-Menüs mit Python und Selen ab und legen Sie ihn fest
Extrahieren Sie die Targz-Datei mit Python
Separate Python-Diagramme (Memo)
Versuchen Sie es mit dem Python Cmd-Modul
Informationen zur Grundlagenliste der Python-Grundlagen
Lernen Sie die Grundlagen von Python ① Grundlegende Anfänger
[Python] Visualisieren Sie die Hitze der Präfekturen Tokio und XX (DataFrame-Nutzungsnotiz)
Organisieren Sie den Fluss, wenn Sie Django mit NGINX und Gunicorn ausführen (persönliches Memo).
Erhalten und schätzen Sie die Form des Kopfes mit Dlib und OpenCV mit Python
Python-Lernnotiz für maschinelles Lernen von Chainer bis zum Ende von Kapitel 2
Python: Grundlagen der Bilderkennung mit CNN
Automatische Erfassung von Aktienkursen mit Python
Informationen zum Erstellen einer GUI mit TKinter of Python
Ändern Sie die Länge der Python-CSV-Zeichenfolgen
Versuchen Sie es mit der Wunderlist-API in Python
Überprüfen Sie das Verhalten des Zerstörers in Python
Übung, dies in Python zu verwenden (schlecht)
[Lernnotiz] Grundlagen des Unterrichts mit Python
[Python3] Verstehe die Grundlagen von Beautiful Soup
Versuchen Sie, die Kraken-API mit Python zu verwenden
Hinter dem Flyer: Docker mit Python verwenden
Übergeben Sie den Pfad des importierten Python-Moduls