grpc_tools.protocol генерирует файлы python с поврежденным импортом

#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