如何使用 python 向 grpc 服务器发送图像旋转请求?
How do I send an Image rotate request to gprc server with python?
我是 grpc 的新手。我无法理解它。无论如何,我正在基于一个名为:image.proto
的 protobuf 文件工作
以下是我的 image.proto 文件的内容:
syntax = "proto3";
option java_multiple_files = true;
message NLImage {
bool color = 1;
bytes data = 2;
int32 width = 3;
int32 height = 4;
}
message NLImageRotateRequest {
enum Rotation {
NONE = 0;
NINETY_DEG = 1;
ONE_EIGHTY_DEG = 2;
TWO_SEVENTY_DEG = 3;
}
Rotation rotation = 1;
NLImage image = 2;
}
service NLImageService {
rpc RotateImage(NLImageRotateRequest) returns (NLImage);
rpc MeanFilter(NLImage) returns (NLImage);
}
我能够创建一个 server.py 文件,并且 client.py。我还从 image.proto 文件生成了 image_pb2.py 并生成了 image_pb2_grpc.py.
现在,我被困在从客户端向服务器发送图像旋转请求,并返回适当的响应。
这是我目前在 client.py
中尝试过的内容
import grpc
# import the generated files
import image_pb2
import image_pb2_grpc
#.......
#.......SEVERAL LINES OF CODE LATER
#.......
print('Input image path is', inputfile)
print('Output path is', outputfile)
print('Mean is', mean)
print("Rotate is", rotate)
channel = grpc.insecure_channel('localhost:5000')
stub = image_pb2_grpc.NLImageServiceStub(channel)
# SEND ROTATION REQUEST IF rotate
img_rotate_request = image_pb2.NLImageRotateRequest()
stub.RotateImage(img_rotate_request, inputfile)
我不确定如何正确发送 RotateImage 请求。
下面是我的server.py:
import sys, getopt
from google.protobuf.descriptor import EnumDescriptor
import grpc
from concurrent import futures
import time
import numpy as np
# importing grpc generated classes
import image_pb2
import image_pb2_grpc
class NLImageServiceServicer(image_pb2_grpc.NLImageServiceServicer):
def RotateImage(self, request, context):
print("Request to rotate image received")
return image_pb2._NLIMAGE()
def MeanFilter(self, request, context):
print("Request to filter received")
return image_pb2.NLImage()
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
image_pb2_grpc.add_NLImageServiceServicer_to_server(NLImageServiceServicer, server)
server.add_insecure_port( host + ":" + str(port))
server.start()
print("Server started ...on " + host + ":" + port)
server.wait_for_termination()
查看您的代码,看起来不错;我没有 运行 它。
您正确地调用了方法:stub.RotateImage
但您没有正确地为其创建消息类型 (NLImageRotateRequest
)。它将是 protoc
为您生成的 class 的一个实例,可能 image_pb2.NLImageRotateRequest
并且它包含 rotation
和 image
属性。 image
本身就是 class image_pb2.Image
等
的一个实例
请参阅此 link 以了解将 protobuf 与 Python 一起使用,因为每种语言都是不同的,并且 Python 在创建消息的方式上有一些怪癖。
在某些时候,您需要以字节形式读入 inputfile
以填充 image
的 data
属性。
如果您还没有,也许 运行 通过 Python HelloWorld 上的示例 grpc.io。它很基础,但可以帮助您开始使用 gRPC。然后查看我上面包含的 link 和 Python.
上的 protobuf 部分
我是 grpc 的新手。我无法理解它。无论如何,我正在基于一个名为:image.proto
的 protobuf 文件工作以下是我的 image.proto 文件的内容:
syntax = "proto3";
option java_multiple_files = true;
message NLImage {
bool color = 1;
bytes data = 2;
int32 width = 3;
int32 height = 4;
}
message NLImageRotateRequest {
enum Rotation {
NONE = 0;
NINETY_DEG = 1;
ONE_EIGHTY_DEG = 2;
TWO_SEVENTY_DEG = 3;
}
Rotation rotation = 1;
NLImage image = 2;
}
service NLImageService {
rpc RotateImage(NLImageRotateRequest) returns (NLImage);
rpc MeanFilter(NLImage) returns (NLImage);
}
我能够创建一个 server.py 文件,并且 client.py。我还从 image.proto 文件生成了 image_pb2.py 并生成了 image_pb2_grpc.py.
现在,我被困在从客户端向服务器发送图像旋转请求,并返回适当的响应。
这是我目前在 client.py
中尝试过的内容import grpc
# import the generated files
import image_pb2
import image_pb2_grpc
#.......
#.......SEVERAL LINES OF CODE LATER
#.......
print('Input image path is', inputfile)
print('Output path is', outputfile)
print('Mean is', mean)
print("Rotate is", rotate)
channel = grpc.insecure_channel('localhost:5000')
stub = image_pb2_grpc.NLImageServiceStub(channel)
# SEND ROTATION REQUEST IF rotate
img_rotate_request = image_pb2.NLImageRotateRequest()
stub.RotateImage(img_rotate_request, inputfile)
我不确定如何正确发送 RotateImage 请求。
下面是我的server.py:
import sys, getopt
from google.protobuf.descriptor import EnumDescriptor
import grpc
from concurrent import futures
import time
import numpy as np
# importing grpc generated classes
import image_pb2
import image_pb2_grpc
class NLImageServiceServicer(image_pb2_grpc.NLImageServiceServicer):
def RotateImage(self, request, context):
print("Request to rotate image received")
return image_pb2._NLIMAGE()
def MeanFilter(self, request, context):
print("Request to filter received")
return image_pb2.NLImage()
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
image_pb2_grpc.add_NLImageServiceServicer_to_server(NLImageServiceServicer, server)
server.add_insecure_port( host + ":" + str(port))
server.start()
print("Server started ...on " + host + ":" + port)
server.wait_for_termination()
查看您的代码,看起来不错;我没有 运行 它。
您正确地调用了方法:stub.RotateImage
但您没有正确地为其创建消息类型 (NLImageRotateRequest
)。它将是 protoc
为您生成的 class 的一个实例,可能 image_pb2.NLImageRotateRequest
并且它包含 rotation
和 image
属性。 image
本身就是 class image_pb2.Image
等
请参阅此 link 以了解将 protobuf 与 Python 一起使用,因为每种语言都是不同的,并且 Python 在创建消息的方式上有一些怪癖。
在某些时候,您需要以字节形式读入 inputfile
以填充 image
的 data
属性。
如果您还没有,也许 运行 通过 Python HelloWorld 上的示例 grpc.io。它很基础,但可以帮助您开始使用 gRPC。然后查看我上面包含的 link 和 Python.
上的 protobuf 部分