Это моя структура каталогов.
.
|-- 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 рассматривал каталоги как пакеты.