python - 警告 :oauth2client. util:build() 最多接受 2 个位置参数(给定 3 个)

标签 python google-api-client google-api-python-client google-cloud-vision

我正在为 Google Cloud Vision API 编写“标签检测”教程。
当我像这样将图像传递给命令时,我希望返回一些 json 告诉我图像中的内容。

但是,我却收到了这个错误。

 😈   >python label_request.py faulkner.jpg 
No handlers could be found for logger "oauth2client.util"
WARNING:root:No module named locked_file
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/googleapiclient/discovery_cache/__init__.py", line 38, in autodetect
    from . import file_cache
  File "/usr/local/lib/python2.7/site-packages/googleapiclient/discovery_cache/file_cache.py", line 32, in <module>
    from oauth2client.locked_file import LockedFile
ImportError: No module named locked_file
Traceback (most recent call last):
  File "label_request.py", line 44, in <module>
    main(args.image_file)
  File "label_request.py", line 18, in main
    service = build('vision', 'v1', http, discoveryServiceUrl=API_DISCOVERY_FILE)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/util.py", line 140, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/googleapiclient/discovery.py", line 202, in build
    raise e
googleapiclient.errors.HttpError: <HttpError 403 when requesting https://vision.googleapis.com/$discovery/rest?version=v1 returned "Project has not activated the vision.googleapis.com API. Please enable the API for project google.com:cloudsdktool (#32555940559).">

这里发生了很多事情。
但项目 API 启用。
所以这是错误信息的一部分是错误的。

似乎“最新版本的 oauth2client v2.0.0 发生了变化,这破坏了与 google-api-python-client 模块的兼容性”。
https://stackoverflow.com/a/35492604/2341218

我应用了这个修复...

pip install --upgrade git+https://github.com/google/google-api-python-client

应用此修复程序后,我得到的错误更少了......

 😈   >python label_request.py faulkner.jpg 
No handlers could be found for logger "oauth2client.util"
Traceback (most recent call last):
  File "label_request.py", line 44, in <module>
    main(args.image_file)
  File "label_request.py", line 18, in main
    service = build('vision', 'v1', http, discoveryServiceUrl=API_DISCOVERY_FILE)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/util.py", line 137, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/googleapiclient/discovery.py", line 209, in build
    raise e
googleapiclient.errors.HttpError: <HttpError 403 when requesting https://vision.googleapis.com/$discovery/rest?version=v1 returned "Project has not activated the vision.googleapis.com API. Please enable the API for project google.com:cloudsdktool (#32555940559).">

看起来这个错误信息: “找不到记录器“oauth2client.util”的处理程序 实际上掩盖了更详细的警告/错误消息 并且我可以通过添加此代码来查看更详细的信息...

import logging 
logging.basicConfig()

https://stackoverflow.com/a/29966147/2341218

 😈   >python label_request.py faulkner.jpg 
WARNING:oauth2client.util:build() takes at most 2 positional arguments (3 given)
Traceback (most recent call last):
  File "label_request.py", line 47, in <module>
    main(args.image_file)
  File "label_request.py", line 21, in main
    service = build('vision', 'v1', http, discoveryServiceUrl=API_DISCOVERY_FILE)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/util.py", line 137, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/googleapiclient/discovery.py", line 209, in build
    raise e
googleapiclient.errors.HttpError: <HttpError 403 when requesting https://vision.googleapis.com/$discovery/rest?version=v1 returned "Project has not activated the vision.googleapis.com API. Please enable the API for project google.com:cloudsdktool (#32555940559).">

所以不,我卡在了这条错误信息上:
警告:oauth2client.util:build() 最多接受 2 个位置参数(给定 3 个)

有人建议可以通过使用命名参数而不是位置符号来避免此错误。
https://stackoverflow.com/a/16643215/2341218

但是,我不确定我到底应该在哪里做这个改变。
我实际上并没有在代码中看到 oauth2client.util:build() 函数。
这是谷歌代码(稍作修改):

 😈   >cat label_request.py
import argparse
import base64
import httplib2

from apiclient.discovery import build
from oauth2client.client import GoogleCredentials

import logging
logging.basicConfig()

def main(photo_file):
  '''Run a label request on a single image'''

  API_DISCOVERY_FILE = 'https://vision.googleapis.com/$discovery/rest?version=v1'
  http = httplib2.Http()

  credentials = GoogleCredentials.get_application_default().create_scoped(
      ['https://www.googleapis.com/auth/cloud-platform'])
  credentials.authorize(http)

  service = build('vision', 'v1', http, discoveryServiceUrl=API_DISCOVERY_FILE)

  with open(photo_file, 'rb') as image:
    image_content = base64.b64encode(image.read())
    service_request = service.images().annotate(
      body={
        'requests': [{
          'image': {
            'content': image_content
           },
          'features': [{
            'type': 'LABEL_DETECTION',
            'maxResults': 1,
           }]
         }]
      })
    response = service_request.execute()
    label = response['responses'][0]['labelAnnotations'][0]['description']
    print('Found label: %s for %s' % (label, photo_file))
    return 0

if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument(
    'image_file', help='The image you\'d like to label.')
  args = parser.parse_args()
  main(args.image_file)

最佳答案

我遇到了完全相同的问题,我只是解决了执行此代码行(您必须安装 gcloud):

gcloud auth activate-service-account --key-file <service-account file.json>

然后:

$ export GOOGLE_APPLICATION_CREDENTIALS=<path_to_service_account_file>

希望对您有所帮助!

关于python - 警告 :oauth2client. util:build() 最多接受 2 个位置参数(给定 3 个),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35755940/

相关文章:

python - NumPy - 一维数组最快的惰性字典序比较

python - 重命名包含子字符串的列 - Pandas

c# - 避免 Google Calendar API 在人们的日历中添加实际事件?

node.js - Nodejs错误: "User does not have sufficient permissions for this profile "

google-calendar-api - Google Calendar API - 不获取重复事件实例

python - 谷歌博客 API : AccessTokenRefreshError:invalid_grand message

python - 如何在 Python Matplotlib 中绘制具有不同时间间隔的两个数据集并让它们共享轴

python - 如何在指定的时间间隔使用 shift 填充 pandas 中的缺失值?

android - 用户退出 : clearing the default Google account does not cause the account picker to show up in Android app

python - 在 Google 自定义搜索 API 中从搜索结果中排除多个字词