Python 请求后tensorflow服务:要解压缩的值太多(预期为2个)
我用我的模型设置了tensorflow运行服务,但当我尝试执行post请求时,它会返回以下错误(get request work): 我的数据是一个数组:Python 请求后tensorflow服务:要解压缩的值太多(预期为2个),python,api,python-requests,Python,Api,Python Requests,我用我的模型设置了tensorflow运行服务,但当我尝试执行post请求时,它会返回以下错误(get request work): 我的数据是一个数组: [array([[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 0
[array([[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
dtype=int32),
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=int32]
代码中有两个独立的问题。一个与有效负载有关,另一个与您使用
请求的方式有关。post
请求使用
requests.post
,就像requests.request
和其他类似函数一样,返回Response
类()的单个实例。因此,要修复错误,您需要从
res, res2 = requests.post(...
到
现在,通常如果您尝试将一件事情解包为两个变量,您会得到一个更明确的错误,即没有足够的值来解包:
>a,b=[1]
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:没有足够的值来解包(预期值为2,实际值为1)
您得到的错误实际上是相反的-您有太多的值要解包。这就是原因
由请求返回的Response
类。post
定义了一个方法(self)
方法(),该方法允许您以块的形式迭代响应,而不是一次读取所有响应。因此,当您执行res,res2=response
时,Python将尝试使用\uuuuu iter\uuuu
实现为您解包响应。如果您的响应中有两个以上的块,那么您将没有足够的变量来处理其他块,因此会出现错误“值太多,无法解包”
这种行为的简单演示:
>>类X():
... 定义(自我):
... 对于范围(5)中的i:
... 产量一
...
>>>x=x()
>>>a,b=x
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:要解压缩的值太多(应为2个)
>>>名单(十)
[0, 1, 2, 3, 4]
有效载荷
当您将数据
关键字参数传递给requests.post
时,它假定您要对其进行表单编码()。您应该传递一个字典或一个元组列表,但您拥有的是一个数组列表,它根本不是一个表单,所以您不想对其进行表单编码
因此,当您传递(data=list\u of\u array)
时,库希望第一个元素是包含两个元素的元组。相反,您有一个包含更多元素的数组,这再次导致相同的错误:太多的值无法解包
相反,您要做的是将其作为JSON或字符串发送。通常,您必须按照文档进行操作
导入json
有效负载=[np.random.randint(2,大小=30).重塑(3,10),np.random.randint(2,大小=30).重塑(3,10)]
res=requests.post('/',data=json.dumps(有效负载))#将其作为字符串传递
res=requests.post('/',json=payload)#或者让库序列化它
不幸的是,您将遇到np.array
不可序列化的问题,因此必须先为序列化做好准备。根据,您只需在np.array
上调用.tolist()
,即可将其序列化为整数列表
因此,最终的解决方案
导入json
有效负载=[np.random.randint(2,大小=30).重塑(3,10),np.random.randint(2,大小=30).重塑(3,10)]
#将两个np.array转换为list
有效负载=[payload[0].tolist(),有效负载[1].tolist()]
#还是这样
有效负载=[arr.tolist()表示arr in数据]
#现在,有效负载是可序列化的
res=requests.post('/',data=json.dumps(有效负载))#将其作为字符串传递
res=requests.post('/',json=payload)#或者让库序列化它
查看错误消息,我发现您为requests.post响应分配了两个变量res,res2,返回值超过2个
#for example
var1, var2 = [1, 2, 3]
#this will raise the same error as your's
要解决这个问题,您需要像下面这样索引您的响应
res, res2 = requests.post('http://url:port/v1/models/colbert:predict',
data=sentence_input)[:2]
print(res.status_code, res.reason)
如果对post请求的响应返回一个列表,索引将解决您的问题
res,res2
您有两个变量吗?在requests.post
中,payad应该是dict而不是array@Ajay,那么有效载荷应该是什么样子?
res = requests.post(
#for example
var1, var2 = [1, 2, 3]
#this will raise the same error as your's
res, res2 = requests.post('http://url:port/v1/models/colbert:predict',
data=sentence_input)[:2]
print(res.status_code, res.reason)