2017-12-06 2 views
3

나는 파이썬 2 용으로 컴파일 된 구글 프로토콜 버퍼를 가지고 있으며 파이썬 3에이 포트를 연결하려고 시도하고있다. 불행하게도 나는 어디에서나 컴파일 된 프로토콜 버퍼를 생성하는데 사용되는 proto 파일을 찾을 수 없다. proto 파일을 복구하여 파이썬 3에 대해 새로운 파일을 컴파일하는 방법은 무엇입니까? 나는 proto 버전이 사용 된 것을 알지 못하고 파이썬 2.6에서 실행되는 .py 파일 만 가지고 있습니다.컴파일 된 프로토콜 버퍼를 다시 .proto 파일로 변환하는 방법?

+1

포스트 파이썬 파일 내용 적어도 –

+0

@TarunLalwani 불행히도 그 파일의 내용이 그래서 그것을 게시 할 수 없습니다 기밀 정보를 받고. –

답변

2

메시지 설명자 트리를 살펴볼 수 있도록 코드를 작성해야합니다 (예 : Python). 그들은 원칙적으로 코드 주석을 제외한 원래의 proto 파일의 모든 정보를 가지고 있어야합니다. 그리고 여러분이 여전히 가지고있는 생성 된 파이썬 모듈은 proto 파일을위한 파일 디스크립터를 proto 코드로 표현하는 코드에 제공 될 수있는 파일 디스크립터 proto 메시지로 직렬화 할 수 있도록해야한다.

가이드로서 protoc에 대한 다양한 코드 생성기를 살펴보아야합니다. protoc에 대한 파일 생성기에서 파일 설명자를 읽고 분석하고 코드를 생성합니다. 여기

파이썬에서

https://www.expobrain.net/2015/09/13/create-a-plugin-for-google-protocol-buffer/

여기 protoc 플러그인

https://github.com/google/protobuf/blob/master/docs/third_party.md

을 공식 목록의 Protobuf 플러그인을 작성하는 방법을 기본적인 소개입니다 그리고 여기 LUA 코드를 생성하는 protoc 플러그인입니다 , 파이썬으로 작성되었습니다.

https://github.com/sean-lin/protoc-gen-lua/blob/master/plugin/protoc-gen-lua

는의 메인 코드 블록

def main(): 
    plugin_require_bin = sys.stdin.read() 
    code_gen_req = plugin_pb2.CodeGeneratorRequest() 
    code_gen_req.ParseFromString(plugin_require_bin) 

    env = Env() 
    for proto_file in code_gen_req.proto_file: 
     code_gen_file(proto_file, env, 
         proto_file.name in code_gen_req.file_to_generate) 

    code_generated = plugin_pb2.CodeGeneratorResponse() 
    for k in _files: 
     file_desc = code_generated.file.add() 
     file_desc.name = k 
     file_desc.content = _files[k] 

    sys.stdout.write(code_generated.SerializeToString()) 

for proto_file in code_gen_req.proto_file: 실제로 코드 생성기 플러그인이 LUA 코드를 생성하는 protoc에 의해 요청 된의 파일 기술자 객체를 통해 루프 루프를 살펴 보자. 그래서 지금 당신이 뭔가를 할 수 있습니다 :

# This should get you the file descriptor for your proto file 
file_descr = your_package_pb2.sometype.GetDescriptor().file 
# serialized version of file descriptor 
filedescr_msg = file_descr.serialized_pb 
# required by lua codegen 
env = Env() 
# create LUA code -> modify it to create proto code 
code_gen_file(filedescr, env, "your_package.proto") 
+0

어떤 의미인지 알 수 있습니까? –

+0

'sometype'은 여러분의 proto 정의에서 어떤 메시지 유형을 사용할 수 있음을 의미합니다. proto 파일의 Proto'FileDescriptor' 오브젝트에 도달하기 위해서는이 타입이 필요합니다. propo 파일에 대한'FileDescriptor' 인스턴스를 얻는 더 직접적인 방법이 있습니다. 그러나 그것에 대한 지식이 없습니다. – Omni

관련 문제