, импортирующих модули, сгенерированные 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

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

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

 import B.b_pb2

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

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

10
задан stefano 23 June 2011 в 14:10
поделиться