La douleur de gRPC en utilisant Python. Novembre 2019. (Mémo personnel)

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

Spicy 1: L'option grpc_tools.protoc est difficile.

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

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.

Spicy 2: le fichier généré n'a pas de chemin relatif.

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

Astuce: comment déboguer

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.

Épicé 3: google.api

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.

Spicy 4: 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

Conclusion

La combinaison de Python et de gRPC ne semble pas familière.

Recommended Posts

La douleur de gRPC en utilisant Python. Novembre 2019. (Mémo personnel)
[Personal memo] julia --Utiliser la bibliothèque Python avec Julia en utilisant PyCall
Essayez d'utiliser le module de collections (ChainMap) de python3
Obtenez la date de mise à jour du fichier de mémorandum Python.
Découpez une partie de la chaîne à l'aide d'une tranche Python
Explication du concept d'analyse de régression à l'aide de Python Partie 1
Explication du concept d'analyse de régression à l'aide de Python Extra 1
Étude de Python Hour8: Utilisation de packages
Mémo de connexion SSH utilisant ProxyCommand de ssh_config en Python
Vers la retraite de Python2
[Mémo personnel] Achèvement automatique du bash
python: principes de base de l'utilisation de scikit-learn ①
mémo python utilisant perl --join
À propos des fonctionnalités de Python
Le pouvoir des pandas: Python
[Mémo] Le mystère des instructions d'affectation cumulative dans les fonctions Python
Afficher à l'aide du module python du backend mobile Nifty Cloud
Un mémo que j'ai écrit une fonction de base en Python en utilisant la récurrence
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
L'histoire de Python et l'histoire de NaN
Capture d'image de Firefox en utilisant Python
[Python] La pierre d'achoppement de l'importation
First Python 3 ~ Le début de la répétition ~
[Python] J'ai écrit la route du typhon sur la carte en utilisant le folium
[Mémo personnel] Mémo de commande d'environnement virtuel Python
Confirmation de la réponse impulsive (mémo personnel)
Suppression de la brume à l'aide de Python detailEnhanceFilter
[Python] Notification LINE des dernières informations à l'aide de la recherche automatique Twitter
pyenv-changer la version python de virtualenv
"Python startbook" mémo compatible python3
[Python] Comprendre le potentiel_field_planning de Python Robotics
Revue des bases de Python (FizzBuzz)
[Note personnelle] Type de séquence / type de mappage Python
Implémentation des notifications de bureau à l'aide de Python
Obtenez et définissez la valeur du menu déroulant en utilisant Python et Selenium
Extraire le fichier targz en utilisant python
Graphiques Python séparés (mémo)
Essayez d'utiliser le module Python Cmd
À propos de la liste de base des bases de Python
Apprenez les bases de Python ① Débutants élémentaires
[Python] Visualisez la chaleur de Tokyo et de la préfecture ○○ (mémo d'utilisation de DataFrame)
Organisez le flux lors de l'exécution de Django en utilisant NGINX et gunicorn (mémo personnel)
Obtenez et estimez la forme de la tête en utilisant Dlib et OpenCV avec python
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer jusqu'à la fin du chapitre 2
Python: principes de base de la reconnaissance d'image à l'aide de CNN
Collecte automatique des cours boursiers à l'aide de python
À propos de la création de l'interface graphique à l'aide de TKinter de Python
Changer la longueur des chaînes csv Python
Essayez d'utiliser l'API Wunderlist en Python
Vérifiez le comportement du destroyer en Python
Pratique d'utilisation de ceci en Python (mauvais)
[Mémo d'apprentissage] Bases de la classe par python
[Python3] Comprendre les bases de Beautiful Soup
Essayez d'utiliser l'API Kraken avec Python
Derrière le flyer: utiliser Docker avec Python
Passez le chemin du module python importé