Импорт модулей protobuf в пакеты

Это моя структура каталогов.

. |-- A | |-- B | | `-- b.proto | `-- C | `-- c.proto `-- py_gen 

Я скомпилирую test.proto, как это

 protoc --python_out=py_gen/ --proto_path ${ROOT}/A ${ROOT}/A/B/b.proto \ ${ROOT}/A/C/c.proto 

и это результаты, которые я получаю.

 . `-- py_gen |-- B | `-- b_pb2.py `-- C `-- c_pb2.py 

Все работает отлично, и я могу импортировать каждый модуль и использовать модуль, если я включу в мой PYTHONPATH $ {ROOT} / A / B / py_gen / B и $ {ROOT} / A / B / py_gen / C.

Проблема возникает, когда, скажем, модуль c import b. Это привело бы к сгенерированному коду для импорта c

  import B.b_pb2 

Это то, что ожидается, потому что «В Python пакеты обычно определяются структурой каталогов» (из учебника protobuf ). Однако я не могу импортировать модуль c, потому что он не находит B.b_pb2.py. На данный момент, чтобы заставить его работать, я должен добавить пустые файлы __init__.py в сгенерированные каталоги B и C. Итак, почему в сгенерированной структуре каталогов нет __init__.py? Я что-то забыл? Я очень новичок в python, поэтому я мог бы не заметить что-то очевидное здесь. Но чтение учебника python

Файлы __init__.py необходимы, чтобы Python рассматривал каталоги как содержащие пакеты.

One Solution collect form web for “Импорт модулей protobuf в пакеты”

Просто:

 import B.b_pb2 

Без окончания .py . Кроме того, для этого в каталоге B должен быть файл __init__.py , который может быть пустым. Это говорит Python, что это каталог пакетов . AFAIK protobuf не будет размещать там __init__.py для вас – но и не должен, поскольку его цель – просто создать для вас один модуль.

  • зарезервированное ключевое слово используется в protobuf в Python
  • Python - лучший язык программирования в мире.