2011-06-23 39 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