在包中导入protobuf生成的模块

ste*_*ano 10 python protocol-buffers

这是我的目录结构.

.
|-- A
|   |-- B
|   |    `-- b.proto
|   `-- C
|        `-- c.proto
`-- py_gen
Run Code Online (Sandbox Code Playgroud)

我像这样编译test.proto

protoc --python_out=py_gen/ --proto_path ${ROOT}/A ${ROOT}/A/B/b.proto \
       ${ROOT}/A/C/c.proto
Run Code Online (Sandbox Code Playgroud)

这是我得到的结果.

.
`-- py_gen
          |-- B
          |    `-- b_pb2.py
          `-- C
               `-- c_pb2.py
Run Code Online (Sandbox Code Playgroud)

一切正常,如果我在PYTHONPATH中包含$ {ROOT}/A/B/py_gen/B和$ {ROOT}/A/B/py_gen/C,我可以导入每个模块并使用该模块.

例如,当模块c导入b时会出现问题.这将转换为生成的c导入代码

 import B.b_pb2
Run Code Online (Sandbox Code Playgroud)

这是预期的,因为"在Python中,包通常由目录结构决定"(来自protobuf教程).但是,我无法导入模块c,因为它找不到B.b_pb2.py.为了让它工作,我必须在生成的目录B和C中添加空的__init__.py文件.那么为什么生成的目录结构中没有__init__.py?我忘记了什么吗?我是python的新手,所以我可能会忽略一些明显的东西.但阅读python 教程

需要__init__.py文件才能使Python将目录视为包含包.

Eli*_*sky 3

只是:

import B.b_pb2
Run Code Online (Sandbox Code Playgroud)

没有.py结局。此外,要使其工作,目录中B必须有一个文件,该文件可以为空。__init__.py这告诉 Python 这是一个目录。据我所知,protobuf 不会将其放入__init__.py其中 - 但也不应该,因为它的目标只是为您生成一个模块。

  • 为什么它不应该生成包结构?它正在生成目录结构,并且了解模块的依赖性。 (5认同)