私は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つのようです。