C'est peut-être normal dans le monde gRPC, mais je noterai qu'un débutant était de manière inattendue accro à l'écriture d'un client gRPC en Python.
Travail basé sur Python Quick Start. Tout d'abord, téléchargez l'exemple de code. Utilisez maintenant la v1.19.0 légèrement plus ancienne au lieu de la dernière v1.25.0. La raison sera décrite plus tard.
git clone -b v1.19.0 https://github.com/grpc/grpc
Changeons le goût du document et créons un projet Python dans un répertoire différent. Encore une fois, nous utiliserons la v1.19.0.
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
Créez un py à partir du fichier proto en utilisant la commande grpc_tools.protoc et écrivez-le dans le répertoire pb
.
python -m grpc_tools.protoc \
-I../grpc/examples/protos/ \
--python_out=pb \
--grpc_python_out=pb \
../grpc/examples/protos/helloworld.proto
-I
: En plus d'être inclus dans proto, l'emplacement du fichier proto à traiter par cette commande doit également être spécifié avec -I.--python_out
: xxx_pb2.py Spécifie le répertoire de sortie du fichier.--grpc_python_out
: xxx_pb2_grpc.py Spécifie le répertoire de sortie du fichier.Tout d'abord, l'option -I est requise. Sans cela, vous obtiendrez l'erreur Le fichier ne réside dans aucun chemin spécifié à l'aide de --proto_path (ou -I) .
. Il est déraisonnable que je ne puisse pas le trouver car j'ai spécifié correctement la position de proto.
De plus, l'option -I a une astuce: si vous spécifiez un répertoire de niveau supérieur, par exemple -I ../ grpc / examples /
, le fichier sera généré dans pb / protos
au lieu de pb
. Si vous ne savez pas, vous serez perdu car vous ne savez pas où est allé le fichier.
De plus, la description de l'option --help
ne mentionne pas la différence entre --python_out
et --grpc_python_out
. Bien qu'il existe des différences comme décrit ci-dessus, il n'est pas raisonnable d'avoir une autre option car il ne suffit pas de simplement échouer l'importation si vous la placez dans un autre répertoire.
Lorsque j'essaye de lire celui créé à partir de python, j'obtiens une erreur.
$ 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'
Le chemin relatif du code généré est incorrect (il semble être de style Python2). Il n'y a pas d'aide pour cela, alors ajoutez pb / __ init __. Py
selon python: utilisez les importations relatives dans les modules générés.
import sys
from pathlib import Path
sys.path.append(str(Path(__file__).parent))
Si cela ne fonctionne pas car il n'y a pas d'erreurs, il est préférable de définir des variables d'environnement et d'exécuter. Démarrez maintenant le serveur et le client et vérifiez le fonctionnement.
$ python ../grpc/examples/python/helloworld/greeter_server.py &
$ export GRPC_TRACE=all
$ export GRPC_VERBOSITY=DEBUG
$ python ../grpc/examples/python/helloworld/greeter_client.py
...Beaucoup de choses sortent.
Greeter client received: Hello, you!
$ unset GRPC_TRACE
$ unset GRPC_VERBOSITY
Bien.
Parfois, il existe un fichier proto qui inclut google.api. Le fichier proto lui-même se trouve sur https://github.com/googleapis/googleapis/tree/master/google/api, vous pouvez donc le télécharger et le spécifier avec -I
, mais je l'ai inclus dans le code converti. Le contenu de proto n'est pas inclus. J'ai senti qu'il serait importé avec l'option --include_imports
, mais ce n'est pas le cas, et je dois installer le converti séparément.
pipenv install googleapis-common-protos
Eh bien, si vous le savez, cela n'a pas d'importance.
propriété ALPN sélectionnée manquante.
Lorsque vous vous connectez à un serveur gRPC existant avec TLS avec la dernière bibliothèque Python grpcio, vous pouvez obtenir la propriété ALPN sélectionnée manquante.
.
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}
Vous pouvez trouver divers faits intéressants en recherchant avec ce mot-clé, mais depuis https://github.com/grpc/grpc/issues/18710, il semble que vous ne puissiez pas accéder au serveur qui ne prend pas en charge la fonction de contrôle ALPN.
Cela ne peut pas être aidé, alors utilisez l'ancienne version v1.19.0 pour rendre le thé boueux. https://stackoverflow.com/questions/57397723/grpc-client-failing-to-connect-to-server-with-tls-certificates
La combinaison de Python et de gRPC ne semble pas familière.
Recommended Posts