Ошибка атрибута DESCRIPTOR при попытке преобразовать ответ Google Vision в словарь с помощью Python
Я в Windows, использую
Python 3.8.6rc1
,
protobuf version 3.13.0
и
google-cloud-vision version 2.0.0
.
Мой код:
from google.protobuf.json_format import MessageToDict
from google.cloud import vision
client = vision.ImageAnnotatorClient()
response = client.annotate_image({
'image': {'source': {'image_uri': 'https://images.unsplash.com/photo-1508138221679-760a23a2285b?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=800&q=60'}},
})
MessageToDict(response)
Это не удается
MessageToDict(response)
, У меня есть
attribute error: "DESCRIPTOR"
. Похоже, что
response
не является допустимым объектом protobuf. Кто-нибудь может мне помочь? Спасибо
4 ответа
На самом деле это не отвечает на мой вопрос, но я считаю, что один из способов решить эту проблему и получить доступ к объекту protobuf - использовать
response._pb
поэтому код становится:
response = client.annotate_image({
'image': {'source': {'image_uri': 'https://images.unsplash.com/photo-1508138221679-760a23a2285b?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=800&q=60'}},
})
MessageToDict(response._pb)
Смотрите шаг 3,
Шаг 1. Импортируйте эту библиотеку
from google.ads.googleads.errors import GoogleAdsException
Шаг 2. Отправьте запрос
keyword_ideas = keyword_plan_idea_service.generate_keyword_ideas(
request=request
)
Шаг 3. Преобразование ответа в формат json [см. Здесь]
keyword_ideas_json = MessageToDict(keyword_ideas._pb) // add ._pb at the end of object
Шаг 4. Делайте с этим все, что хотите
json
print(keyword_ideas_json)
Github для этой же проблемы: здесь
может взглянуть на этот пост
json_string = type(response).to_json(response)
# Alternatively
import proto
json_string = proto.Message.to_json(response)
Из сообщения github, опубликованного @FriedrichSal, вы можете видеть, чтоproto
выполняет свою работу, и это все еще действует в 2022 году (название библиотекиproto-plus
):
Все типы сообщений теперь определяются с помощью proto-plus, в котором используются разные методы сериализации и десериализации.
import proto
objects = client.object_localization(image=image)
json_obs = proto.Message.to_json(objects)
dict_obs = proto.Message.to_dict(objects)
The MessageToJson(objects._pb)
все еще работает, но, возможно, кто-то предпочитает не зависеть от «скрытого» свойства.