#python #protocol-buffers #grpc #grpc-python
#python #буферы протокола #grpc #grpc-python
Вопрос:
Я пытаюсь использовать gRPC в Python. У меня следующий макет каталога:
Oracle
|
│ setup.py
│
└───oracle
│ oracle_server.py
│ __init__.py
│
├───generated
│ oracle_pb2.py
│ oracle_pb2_grpc.py
│ __init__.py
│
│
└───protos
oracle.proto
где я запускал
python -m grpc_tools.protoc -I ../protos --python_out=. --grpc_python_out=. ../protos/oracle.proto
в Oracle/generated
.
Проблема:
Oracle/oracle/generated/oracle_pb2_grpc.py
начинается с
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc
import oracle_pb2 as oracle__pb2
и этот второй импорт завершается с ошибкой, ModuleNotFoundError: No module named 'oracle_pb2'
когда я импортирую oracle_pb2_grpc.py
из любого места извне Oracle/oracle/generated
, например, с помощью
from oracle.generated import oracle_pb2_grpc
в
Oracle/oracle/oracle_server.py
.
Вопрос:
Я делаю что-то не так? Могу ли я добавить аргумент к вызову grpc_tools.protoc
, чтобы он генерировал импорт, который работает в моей настройке?
(Пример наhttps://github.com/grpc/grpc/tree/master/examples/python/helloworld не сталкивается с этой проблемой, поскольку все файлы находятся в одном каталоге. Для меня это недостаточно гибко / чисто)
Ответ №1:
Я подозреваю, что обработка «сгенерированной» папки как пакета приводит к поврежденному импорту. Я рекомендую добавить путь к сценариям с помощью sys.path.append().
Ответ №2:
grpc генерирует импорт python2, используйте
2to3 -n -w *
в выходном каталоге изменить на python3