Ошибка атрибута 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)все еще работает, но, возможно, кто-то предпочитает не зависеть от «скрытого» свойства.

Другие вопросы по тегам