grpc_tools.protoc генерирует файлы 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

in 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

in Oracle/oracle/oracle_server.py.

Вопрос:

Я делаю что-то неправильно? Могу ли я добавить аргумент к вызову grpc_tools.protoc, чтобы он генерировал импорт, который работает в моей настройке?

(Пример на https://github.com/grpc/grpc/tree/master/examples/python/helloworld не сталкивается с этой проблемой, потому что все файлы находятся в одном каталоге. Это недостаточно гибко/чисто для меня)


person Bananach    schedule 10.09.2020    source источник


Ответы (2)


Я подозреваю, что обработка «сгенерированной» папки как пакета приводит к нарушению импорта. Я рекомендую добавить путь к сценариям с помощью sys.path.append().

person Jlidi Borhen    schedule 14.09.2020

grpc генерирует импорт python2, используйте

2to3 -n -w *

в выходном каталоге, чтобы перейти на python3

person Jason Mads    schedule 04.06.2021