这是我的目录结构。在软件包中导入protobuf生成的模块
.
|-- A
| |-- B
| | `-- b.proto
| `-- C
| `-- c.proto
`-- py_gen
我这样进行编译
protoc --python_out=py_gen/ --proto_path ${ROOT}/A ${ROOT}/A/B/b.proto \
${ROOT}/A/C/c.proto
的test.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
这是预期的,因为(从the protobuf tutorial)“在Python,包通常由目录结构决定的”。但是,我无法导入模块c,因为它没有找到B.b_pb2.py。目前,为了使它工作,我必须在生成的目录B和C中添加空的__init__.py文件。 那么为什么生成的目录结构中没有__init__.py?我忘记了什么吗?我对python非常陌生,所以我可能在这里忽略一些明显的东西。但是阅读python tutorial
需要__init__.py文件才能使Python将目录视为包含包。
我的确输入了没有.py扩展名的文件,这是我在编写问题(我正在纠正它)时的错误,谢谢。 – stefano
为什么它不应该生成包结构?它正在生成目录结构并知道模块的依赖关系。 – stefano