알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)
python gRPC Gen Code 생성기 사용 방법 본문
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()
위와 같이 파일을 만들어 해당 파이썬 파일을 실행 시켜 소스파일을 생성 시키는 방법을 사용한다.