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