알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)

python gRPC Gen Code 생성기 사용 방법 본문

카테고리 없음

python gRPC Gen Code 생성기 사용 방법

백곳 2021. 2. 16. 09:55

grpc.io/docs/languages/python/quickstart/

 

Quick start

This guide gets you started with gRPC in Python with a simple working example.

grpc.io

문서에는 

툭 하니 아래와 같이 쓰라고 하고 설명을 읽었지만 

이렇게 하면 helloworld_pb2.py , helloworld_pb2_grpc.py 가 생성 된다고 나오지만 

Input 인자에 대한 이해가 부족해 한참을 헤메 었기에 적어 둔다. 

python -m grpc_tools.protoc -I../../protos --python_out=. --grpc_python_out=. ../../protos/helloworld.proto

 

-I 옵션은 protos 파일이 들어 있는 폴더를 선택해 준다. 

--python_out 에 _pb2.py 을 생성한 폴더를 선택해 준다. 

--grpc_python_out 에 grpc.py을 생성해 준다. 

 

그리고 제일 마지막에 proto 파일을 적어 주는게 생성할때 Input이 되는 파일이다. 

 

여기서 -I 는 왜 경로는 적어주는 이유는 개인적으로 

import 부분이 원인이 되는것으로 파악 된다. 

아래와 같이 proto 파일이 protos  폴더 밑에 있다고하면 

 

PredictComUsecase.proto 

syntax = "proto3";

package CapaService.PredictComUseCase;

service PredictComUseCase {
  // Sends a greeting
  rpc predictAllMix (PredictAllMixReq) returns (PredictAllMixResultRes) {}
}

message PredictAllMixReq {
   string eqpId = 1;
}

message PredictAllMixResultRes {
  repeated  PredictAllMixRes list = 1;
}

message PredictAllMixRes {
     int32 runTime = 1;
     int32 output = 2;
     string eqpId = 3;
}

Test23.proto

syntax = "proto3";

import "PredictComUseCase.proto";

package CapaService.Test23;

service TEST23 {
  // Sends a greeting
  rpc predictAllMix (TEST221) returns (TEST333) {}
}

message TEST221 {
   string eqpId = 1;
}

message TEST333 {
  repeated  PredictComUseCase.PredictAllMixRes list = 1;
}

 

에서 저 -I 옵션을 적어 주지 않으면 생성시 에러가 난다. 

 

참고로 이유는 모르나 Pytcharm 에서 Import 를 사용시 아래와 같이 빨간색으로 뭔가 오류가 뜬것 처럼 보이나 

 

코드 생성시 문제 없이 잘된다... 이부분에서 한참 애를 먹었다. 

오류 인가? 하고 계속 의심의 끈을 놓지 못했기 때문이다.

 

그런데 pb2_grpc.py 가 프로젝트의 Root 폴더에 있지 않을때 실행시 

아래와 같은 에러가 뜬다.

Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Users\PycharmProjects\CapaService\Bis\CapaPredict\Domain\UseCase\PredictComUseCase.py", line 12, in <module>
    from build.gen.PredictComUseCaseGrpc_pb2_grpc import PredictComUseCaseGrpcServicer
  File "C:\Users\PycharmProjects\CapaService\build\gen\PredictComUseCaseGrpc_pb2_grpc.py", line 5, in <module>
    import PredictComUseCaseGrpc_pb2 as PredictComUseCaseGrpc__pb2
ModuleNotFoundError: No module named 'PredictComUseCaseGrpc_pb2'

 

그래서 

google Stack overflow 어디선가 가져온 해결책인데 출처가 생각이 안난다... 

 

으로 파일을 1개 만든 다음에 

 

GrpcMakeCode.py

import glob
import re

from grpc_tools import protoc

# Generate stubs from `api/*.proto` files in `api/gen` directory


if __name__ == '__main__':
    protoc.main([
                    'grpc_tools.protoc',
                    '--proto_path=protos',
                    '--python_out=build/gen',
                    '--grpc_python_out=build/gen'
                ] + [proto for proto in glob.iglob('protos/*.proto')])

    # Make pb2 imports in generated scripts relative
    for script in glob.iglob('build/gen/*.py'):
        with open(script, 'r+') as file:
            code = file.read()
            file.seek(0)
            file.write(re.sub(r'(import .+_pb2.*)', 'from . \\1', code))
            file.truncate()

  

  

 

위와 같이 파일을 만들어 해당 파이썬 파일을 실행 시켜 소스파일을 생성 시키는 방법을 사용한다. 

 

 

Comments