2017-12-14 17 views
0

종속성. 내 상황은 직관적이라고 생각하지만 긴 설명이 필요합니다. 하나의 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의 가장 간단한 사용 사례 중 하나와 같습니다.

답변

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