naoki86star

インターネットの片隅でなにかしら書いてみる

gobgpd + grpc + python in Oct/2019

ひと月ちょっと前より説明しやすいworkaroundが見えたので書いておきます。実は2年位前のここをそのまま真似たら悪くない結果だったです。

OS:ubuntu18.04
python3(2でもいいと思う)
gobgpd:2.9.0
grpc:pip3でインストール

pip3 install grpcio grpcio-tools

protobuf:pip3でインストール

pip3 install protobuf

gobgpのソースを展開してgobgp-2.9.0ディレクトリに入る

pythonでgobgpのgrpc呼ぶのに必要なファイルを作るここのコマンドの前に、gobgp-2.9.0/apiディレクりのgobgpd.proto attribute.protoでそれぞれ

import "any/any.proto";
import "empty/empty.proto";
import "timestamp/timestamp.proto";

とあるのを

import "google/protobuf/any.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";

と書き換える。そのあとに

$ python3 -m grpc_tools.protoc -I./api --python_out=. --grpc_python_out=. api/gobgp.proto api/attribute.proto api/capability.proto

ただしもうgo listを呼ばずそこの部分の-Iは指定してない。

生成された*_pb2.py,*_pb2_grpc.pyがそのまま正常に動いてくれます。

https://github.com/osrg/gobgp/blob/master/tools/grpc/python/add_path.py:titile=tools/grpc/python/add_path.pyとか、modpath.pyとか動いてくれます。(2to3をかます必要はある)

確証もなにもないですけど、経験則的に、grpc, protobufはapt/pip/gitにせよ一貫して同じパッケージシステムで導入するがよいように思いました。venv*1とか使うのがなにかあったらやり直しできるので効率的。

*1:python3だとstandardになった?らしいし