2010-10-26 25 views
0

J'ai ma structure de répertoire comme ceci:Comment importer des définitions de tampon de protocole d'un autre paquet Python?

root/ 
    sift/ 
    __init__.py 
    sift_descriptors.proto 
    sift_descriptors_pb2.py 
    project/ 
    __init__.py 
    filtered_descriptors.proto 
    filtered_descriptors_pb2.py 
    filtered_descriptors_test.py 

Le répertoire racine est dans mon $PYTHONPATH.

Je construis root/sift/sift_descriptors_pb2.py utilisant protoc --python_out=./ sift_descriptors.proto

Je construis root/project/filtered_descriptors_pb2.py utilisant /cs/public/lib/pkg/protobuf/bin/protoc --proto_path=../sift --proto_path=./ --python_out=./ filtered_descriptors.proto

En filtered_descriptors.proto, j'utilise import "sift_descriptors.proto"

Le problème est que dans filtered_descriptors_pb2.py (produit par protoc), il y a une déclaration qui fait juste cette importation nue: import sift_descriptors_pb2, sans référence via le nom du module comme cela serait nécessaire: from sift import sift_descriptors_pb2.

Qu'est-ce que je fais mal?

Répondre

1

je l'ai fixé!

La solution était d'utiliser import "sift/sift_descriptors.proto" dans filtered_descriptors.proto, puis pointez protoc---proto_path=../ au lieu de --proto_path=../sift.

Ensuite, le protocole génère un code python qui effectue l'importation en tant que import sift.sift_descriptors_pb2. Oups, c'était une erreur de transcription.

+0

En parlant avec les responsables des tampons de protocole, --proto_path est supposé pointer vers la racine de la hiérarchie du paquet et toutes les importations doivent être entièrement qualifiées. Pas bien décrit dans la documentation, mais ils vont le réparer :) –

1

ne pas ajouter .py à la déclaration d'importation: "de sift_descriptors_pb2 import EIPD"

+0

J'ai corrigé ma question. –

+0

Merci! Mais, pour être clair, ma question est toujours valable. Je l'avais juste demandé incorrectement au début. –