2011-06-23 40 views
8

这是我的目录结构。在软件包中导入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将目录视为包含包。

回答

3

刚:

import B.b_pb2 

没有.py结局。此外,要使其工作,B目录中必须包含__init__.py文件,该文件可以为空。这告诉Python这是一个目录。 AFAIK protobuf不会把__init__.py放在那里 - 但它也不应该,因为它的目标是为你生成一个单一的模块。

+0

我的确输入了没有.py扩展名的文件,这是我在编写问题(我正在纠正它)时的错误,谢谢。 – stefano

+4

为什么它不应该生成包结构?它正在生成目录结构并知道模块的依赖关系。 – stefano