2017-12-14 7 views
0

私はprotocを使ってPython 3にいるProtobufスキーマファイルをコンパイルするんだけど、__init__.py__all__を経由してインポートした後、私はFileDescriptorオブジェクトのdependenciesリストからAttributeErrorを取得しています。私の状況は直感的だと思いますが、長い記述が必要です。私は同じパッケージ内に別のものをインポートするprotobufスキーマを持っています。これは、生成されたPythonファイルがそれを参照しようとする前に、モジュールがまだ初期化されていない、循環依存の問題のように思えます。Pythonの3いるProtobufはAttributeError

これは、コンパイルする前に、私のディレクトリ構造です:

protoc --python_out=. company_package/project_package/foo.proto 
protoc --python_out=. company_package/project_package/bar.proto 

独立しfoo.protoを含む:含むbuild.sh

company_package 
    \ project_package 
     \ bar.proto # imports foo.proto 
     \ foo.proto 
     \ __init__.py # exposes classes via __all__ 
    \ __init__.py  # has extend_path from pkgutil 
build.sh 

前述したように、

syntax = "proto2"; 

package company; 

message Foo { 
    required string msg = 1; 
} 

をして、従属物bar.proto含有:

syntax = "proto2"; 

import "company_package/project_package/foo.proto"; 

package company; 

message Bar { 
    required Foo foo = 1; 
} 

company_package__init__.py通常pkgutil.extend_pathコードを有しています。

from .foo_pb2 import Foo 
from .bar_pb2 import Bar 


__all__ = ['Foo', 'Bar'] 

sh build.sh呼び出した後、ディレクトリ構造は次のとおりです:project_package__init__.pyは含まれてい

company_package 
    \ project_package 
     \ bar_pb2.py 
     \ bar.proto 
     \ foo_pb2.py 
     \ foo.proto 
     \ __init__.py 
    \ __init__.py 
build.sh 

と私は隔離された仮想環境でのREPLを開き、次の行を実行した場合、私はこれを取得しますエラー:レコードの

In [1]: from company_package.project_package import * 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-1-70765a748bd5> in <module>() 
----> 1 from company_package.project_package import * 

{omitted}/company_package/project_package/__init__.py in <module>() 
     1 from .foo_pb2 import Foo 
----> 2 from .bar_pb2 import Bar 
     3~ 
     4~ 
     5 __all__ = ['Foo', 'Bar'] 

{omitted}/company_package/project_package/bar_pb2.py in <module>() 
    22 serialized_pb=_b('\n)company_package/project_package/bar.proto\x12\x07\x63ompany\x1a)company_package/project_package/foo.proto\" \n\x03\x42\x61r\x12\x19\n\x03\x66oo\x18\x01 \x02(\x0b\x32\x0c.company.Foo') 
    23 , 
---> 24 dependencies=[company_package.project_package.foo_pb2.DESCRIPTOR,]) 
    25 _sym_db.RegisterFileDescriptor(DESCRIPTOR) 
    26~ 

AttributeError: module 'company_package' has no attribute 'project_package' 

、私はGitHubの上で悪名高いいるProtobuf/Pythonの3の問題の記事を見てきた、と私は多少、特定のthaのよ同じではないproblem

私の主な質問は、なぜこれは機能しないのですか?これはprotobufの最も単純なユースケースの1つのようです。

答えて

0

私の問題は、旧バージョンのprotocコンパイラを使用していたことでした。 GitHub repositoryに最新バージョンをダウンロードできます。ここで

は私のバージョン情報は、問題が解決されることになりました:

$ protoc --version 
libprotoc 3.5.0 
$ pip show protobuf 
Name: protobuf 
Version: 3.5.0.post1 
Summary: Protocol Buffers 
Home-page: https://developers.google.com/protocol-buffers/ 
Author: [email protected] 
Author-email: [email protected] 
License: 3-Clause BSD License 
Location: {omitted}/venv/lib/python3.5/site-packages 
Requires: six, setuptools 
関連する問題