Достичь относительного пути в сгенерированном импорте модуля с помощью grpcio-tools

Я генерирую модули из двух разных протоколов, у которых есть общие имена файлов proto. Из протос-1 - ›

python3 -m grpc_tools.protoc --proto_path=p1/protos/ --python_out=. --grpc_python_out=. p1/protos/common/*.proto
python3 -m grpc_tools.protoc --proto_path=p1/protos/ --python_out=. --grpc_python_out=. p1/protos/p1-unique/*.proto

Из протос-2 - ›

python3 -m grpc_tools.protoc --proto_path=p2/protos/ --python_out=. --grpc_python_out=. p2/protos/p2-unique/*.proto
python3 -m grpc_tools.protoc --proto_path=p2/protos/ --python_out=. --grpc_python_out=. p2/protos/common/*.proto

Выполнение вышеуказанных команд для p1, за которым следует p2, отменяет сгенерированный модуль common для p1. Следовательно, у него есть проблемы в сгенерированном файле p1-unique_pb2.py. (неверная ссылка модуля common)

Затем я попытался сгенерировать модули из protos-2 в отдельной папке с

python3 -m grpc_tools.protoc --proto_path=p2/protos/ --python_out=./abc --grpc_python_out=./abc p2/protos/p2-unique/*.proto
python3 -m grpc_tools.protoc --proto_path=p2/protos/ --python_out=./abc --grpc_python_out=./abc p2/protos/common/*.proto

но все же импорт в p2-unique_pb2.py является абсолютным from common import common_pb2 as common_dot_common__pb2 и, следовательно, относится к модулю common, сгенерированному protos-1

Я попробовал несколько предоставленных решений .. https://github.com/grpc/grpc/issues/9575, но ни один из них не помог в решении этой проблемы.


person user7630232    schedule 08.04.2021    source источник


Ответы (1)


Технически это проблема ProtoBuf. Из описания я не знаю, одинаковы ли common/*.proto для protos-1 и protos-2. Если они такие же, я думаю, вы вообще не будете публиковать этот выпуск. Если они разные, вы можете попробовать сопоставить структуру папок с именем прото-пакета.

Например, у вас есть прото-файл bar.proto с именем пакета p2.common, тогда он должен быть помещен в ./p2/common/bar.proto. Команда protoc может принимать просто proto_path=.. Если проектов несколько, перед компиляцией можно подумать о копировании всех прото-файлов в центральное место.

Существует множество известных жалоб на создание пути импорта Python, дополнительную информацию можно найти в https://github.com/protocolbuffers/protobuf/issues.

person Lidi Zheng    schedule 14.04.2021