импорт сгенерированных протобуф модулей внутри пакетов - PullRequest
10 голосов
/ 23 июня 2011

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

.
|-- 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

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

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

 import B.b_pb2

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

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

1 Ответ

3 голосов
/ 23 июня 2011

Just:

import B.b_pb2

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...