종속성. 내 상황은 직관적이라고 생각하지만 긴 설명이 필요합니다. 하나의 protobuf 스키마를 가져 와서 동일한 패키지에 다른 스키마를 가져옵니다. 이것은 거의 원형 종속성 문제처럼 보입니다. 생성 된 파이썬 파일이 모듈을 참조하기 전에 아직 모듈이 초기화되지 않은 것 같습니다.파이썬 3 Protobuf AttributeError 내가 protoc를 사용하여 파이썬 3 protobuf 스키마 파일을 컴파일하고있어하지만 <code>__init__.py</code>의 <code>__all__</code>를 통해 가져온 후, 나는 <code>FileDescriptor</code> 개체의 <code>dependencies</code> 목록에서 <code>AttributeError</code>납니다 목록
이 컴파일하기 전에, 내 디렉토리 구조입니다 :
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/파이썬 3 문제의 게시물을 보았다, 나는 다소 특정 그쪽이야 그것은 동일하지 않다 problem.
내 주요 질문은 다음과 같습니다. 왜이 기능이 작동하지 않습니까? 이것은 protobuf의 가장 간단한 사용 사례 중 하나와 같습니다.