#python #grpc #google-cloud-vision #google-vision #vcr
#python #grpc #google-облачное видение #google-vision #Видеомагнитофон
Вопрос:
Я пишу тест для получения данных метки из API Google Cloud Vision.
В рамках теста я использую vcrpy для хранения результатов поиска моей метки.
with vcr.use_cassette(
vcr_cassette_path.as_posix(), record_mode="twice",
match_on=["uri", "method"], decode_compressed_response=True):
labels = GCloudVisionLabelsRetriever().get_labels(self.FILE_PATH.as_posix())
Который в конечном итоге вызывает этот блок, как определено самим Google https://cloud.google.com/vision/docs/labels#detect_labels_in_a_local_image:
def detect_labels_from_path(path: str):
client = vision.ImageAnnotatorClient(
credentials=settings.GCLOUD_CREDENTIALS)
with io.open(path, 'rb') as image_file:
content = image_file.read()
image = vision.Image(content=content)
response = client.label_detection(image=image)
labels = response.label_annotations
return labels
Это нормально для первого запуска теста. Во второй раз, когда выполняется тест, я получаю сообщение об ошибке, в котором говорится, что доступ к Google не прошел проверку подлинности.
Я считаю, что это связано с тем, что видеомагнитофон не поддерживает gRPC, что и происходит под капотом.
Интересно, есть ли какой-нибудь способ издеваться над этим или, может быть, пакет, который может работать с gRPC для тестов python?
Ответ №1:
Необходимо создать новый клиент с vision.ImageAnnotatorClient каждый раз, когда вы вызываете API, вместо этого вам нужно создать клиент, а затем выполнить цикл клиента.label_detection. Кроме того, я думаю, что передача учетных данных Google как
client = vision.ImageAnnotatorClient(credentials=settings.GCLOUD_CREDENTIALS)
это неправильный способ, если вы настроили GCLOUD_CREDENTIALS в своем path, нет необходимости указывать его, например:
client = vision.ImageAnnotatorClient()
Хотя, если вы хотите указать путь к своей учетной записи службы в формате json, вы можете использовать для этого следующий код:
import os
import io
from google.cloud import vision
from google.oauth2 import service_account
#Loads the service account JSON credentials from a file
credentials = service_account.Credentials.from_service_account_file('SERVICE_ACCOUNT_KEY_FILE.json')
client = vision.ImageAnnotatorClient(credentials=credentials)
#I you have configure the GCLOUD_CREDENTIALS to your path, use this instead
#client = vision.ImageAnnotatorClient()
image_path = "wakeupcat.jpg"
with io.open(image_path, 'rb') as image_file:
content = image_file.read()
image = vision.types.Image(content=content)
# Performs label detection on the image file
response = client.label_detection(image=image)
labels = response.label_annotations
print('Labels:')
for label in labels:
print(label.description)