2011-06-23 27 views
8

Bu benim dizin yapımızdır.Paketlerde protobuf üretilen modüller içe aktarılıyor

. 
|-- A 
| |-- B 
| | `-- b.proto 
| `-- C 
|  `-- c.proto 
`-- py_gen 

Bu

protoc --python_out=py_gen/ --proto_path ${ROOT}/A ${ROOT}/A/B/b.proto \ 
     ${ROOT}/A/C/c.proto 

gibi test.proto derlemek ve bana böyle sonuçlar olduğunu.

. 
`-- py_gen 
      |-- B 
      | `-- b_pb2.py 
      `-- C 
       `-- c_pb2.py 

Her şey gayet iyi çalışıyor ve ben $ {KÖK}/A/B/py_gen/B ve $ {ROOT}/A/B/py_gen/eklerseniz ben modülü her modülü almak ve kullanabilirsiniz Benim PYTHONPATH'da.

Modül c ithalatı söz konusu olduğunda sorun geliyor b. (the protobuf tutorial itibaren) "Python, paketler normalde dizin yapısı tarafından belirlenir" Bunun nedeni,

import B.b_pb2 

Bu beklenen budur ithal c için oluşturulan kodda çevirmek olacaktır. Ancak, B.b_pb2.py'yi bulamadığı için c modülünü içe aktaramıyorum. Şu anda, çalışmasını sağlamak için, oluşturulan dizinler B ve C içinde boş __init__.py dosyalarını eklemek zorundayım. Peki neden oluşturulan dizin yapısında __init__.py yok? Bir şey unutuyor muyum? Pitona çok yeni geldim, bu yüzden burada bariz bir şeye bakabilirim. Ama piton tutorial

okuma __init__.py dosyaları Python paketlerini içeren dizinler olarak algılaması için gereklidir.

cevap

3

Sadece: .py biten olmadan

import B.b_pb2 

. Ayrıca, bunun çalışması için, B dizini içinde boş bir __init__.py dosya olması gerekir. Bu Python'a bu paketini dizinine bildirir. AFAIK protobufu sizin için __init__.py'u koyamaz - ama amacı, sadece sizin için tek bir modül oluşturmasıdır.

+0

Gerçekten de .py uzantısı olmadan içe aktarım yapıyorum, bu soru yazarken benim hatamdı (düzeltiyorum), teşekkürler. – stefano

+4

Neden paket yapısını oluşturmamalı? Dizin yapısını oluşturuyor ve modüllerin bağımlılıklarının farkında. – stefano

İlgili konular