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
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
-I
: Zusätzlich zum Einfügen in Proto muss der Speicherort der von diesem Befehl zu verarbeitenden Protodatei auch mit -I angegeben werden.--python_out
: xxx_pb2.py Gibt das Verzeichnis an, in dem die Datei ausgegeben werden soll.--grpc_python_out
: xxx_pb2_grpc.py Gibt das Verzeichnis an, in dem die Datei ausgegeben werden soll.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.
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))
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.
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.
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
Die Kombination von Python und gRPC scheint unbekannt zu sein.
Recommended Posts