【问题标题】:Why is oauth2client run_flow giving an Argparse error?为什么 oauth2client run_flow 会给出 Argparse 错误?
【发布时间】:2019-06-06 14:56:23
【问题描述】:

我有一个使用 oauth2client 访问谷歌驱动器的 python (2.7) 程序。我正在尝试获取我的初始凭据文件。我正在使用这个:

from oauth2client.client import flow_from_clientsecrets
from oauth2client.tools import run_flow


    SCOPE = 'https://www.googleapis.com/auth/drive'
    credentials = 'https://www.googleapis.com/auth/drive'
    CLIENT_SECRET_FILE = os.path.join(credential_path, 'client_secret.json'
    flow = flow_from_clientsecrets(CLIENT_SECRET_FILE, scope=SCOPE)
    http = httplib2.Http()
    credentials = run_flow(flow, store, http=http)

但是,我收到了似乎是 Argparser 使用错误?

usage: responseratedash2.py [--auth_host_name AUTH_HOST_NAME]
                            [--noauth_local_webserver]
                            [--auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT ...]]]
                            [--logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
responseratedash2.py: error: unrecognized arguments: -r 2341 -t

responseratedash2.py 是我的程序的名称,-r 2341 -t 是该程序的有效参数。但是这个错误发生在run_flow 行...

为什么会这样?

(ETA:解释我如何使用 oauth2client,流程函数都来自该库。)

【问题讨论】:

  • 看来responseratedash2 有自己的解析器,并且使用与您自己的代码相同的sys.argv。因此,虽然-r 可能对您的代码有效,但它对该解析器无效。您可以查看它识别哪些参数,所有这些登录值。
  • 当然,但是为什么很多人使用的任何库都使用 sys.argv?如何让它不假设周围的程序没有它自己的参数?
  • 哦,responseratedash2 是我的程序的名称。列出的用法不是 responseratedash2 的正确用法。 -r 和 -t 会触发 responseratedash2。
  • oauth2client 应该如何获得这些论点?你自己的代码可以吗?是否准备好将它们传递给相关的模块或功能。我以前见过这样的问题,但不记得解决方案。我怀疑oautho2client(或它的任何名称)是作为脚本调用的,而不是作为嵌入式模块调用的。您没有显示任何有关如何调用它的信息。

标签: python-2.7 argparse oauth2client


【解决方案1】:

由于某种原因,答案似乎是 oauth2client.tools 假设您使用命令行参数运行它。最初的用例可能有一个很好的理由,但对我来说看起来真的很奇怪。

解决方案是run_flow 采用flags 参数,可以通过以下方式设置:

flags=oauth2client.tools.argparser.parse_args(args=[])

将其归零...

【讨论】:

  • 是的,函数代码所做的第一件事是检查是否为flags is None,在这种情况下,它将设置为flags=argparser.parse_args()。我建议查看您的代码运行的 flags 变量。运行 parse_args[] 相当于运行没有任何命令行值的脚本。
  • 我的意思是,使用 [] 运行 parse_args 是运行库函数的唯一方法,就好像它没有命令行参数一样...(我尝试将 [] 作为标志传递给 run_flow,但它没有'似乎不起作用...)
  • 对,flags 应该是具有正确属性的argparse.Namespace。或功能等价物。 Namespace 类并不复杂。它只是在寻找 3 个记录在案的属性。使用 args=[] 会生成带有文档默认值的标志。
猜你喜欢
  • 2020-12-24
  • 2020-08-22
  • 1970-01-01
  • 2019-06-03
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多