这是我的目录结构。
.
|-- 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导入b。这将转换为生成的c导入代码
import B.b_pb2
这是预期的结果,因为“在Python中,包通常由目录结构决定”(来自the protobuf tutorial)。但是,我无法导入模块c,因为它找不到B.b_pb2.py。目前,为了让它工作,我必须在生成的目录B和C中添加空的__init__.py文件。 那么为什么生成的目录结构中没有__init__.py?我忘记了什么吗?我是python的新手,所以我可能会忽略一些明显的东西。但是阅读python tutorial
需要__init__.py文件才能使Python将目录视为包含包。
答案 0 :(得分:3)
只需:
import B.b_pb2
没有.py
结尾。此外,要使其正常工作,B
目录中必须包含__init__.py
文件,该文件可以为空。这告诉Python这是一个包目录。 AFAIK protobuf不会将__init__.py
放在那里 - 但也不应该,因为它的目标是为你生成一个模块。