【问题标题】:python: argparser.add_argument() causes ArgumentError()python: argparse.add_argument() 导致 ArgumentError()
【发布时间】:2016-05-16 18:05:56
【问题描述】:

我遇到了一个非常奇怪的问题——当我使用argparser.add_argument() 方法时,我得到了ArgumentError()

from oauth2client.tools import argparser, run_flow

if __name__ == "__main__":
  argparser.add_argument("--videoid", default="L-oNKK1CrnU",
    help="ID of video to like.")

我正在使用 pdb 运行代码,这就是我得到的错误:

(Pdb) n
ArgumentError: ArgumentError()
> c:\py\googleapitest.py(48)<module>()->None
-> help="ID of video to like.")

这是根本原因:

C:\Python27\lib\argparse.pyc in _handle_conflict_error(self, action, conflicting_actions)
   1452                                      for option_string, action
   1453                                      in conflicting_actions])
-> 1454         raise ArgumentError(action, message % conflict_string)

即使我没有传递“帮助”参数,我也会收到错误消息。

我做错了什么?

【问题讨论】:

  • 什么是argparser
  • argparser 实际上是一个argparse 解析器:github.com/google/oauth2client/blob/master/oauth2client/…。代码中没有 --videoid 选项。此外,我尝试了示例代码,它对我有用(即不会引发错误)。但是我使用 GNU/Linux,并且我看到 OP 在 Windows 上运行代码 — argparse 在那里的行为会有所不同吗?
  • 现在我倾向于认为 --videoid 确实被添加到代码中其他地方的 argparser 中,就像@tdelaney 说的那样。你能检查一下吗?作为对该假设的简单测试,请尝试运行您的第一个清单中的确切代码,看看是否引发了错误。
  • 另外,我浏览了oauth2client 代码,没有videoid 出现。
  • 就在您添加论点之前,请查看argparser.print_help() 中已有的内容。如果您在添加参数之前看到了参数,则说明是其他人做的。

标签: python arguments parameter-passing


【解决方案1】:

你必须初始化一个解析器。我会这样做(我认为 oauth.tools 确实链接到 argparse):

import argparse

def main(args):
    pass
    #reference args.videoid to use in the code

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--videoid", dest='videoid',default="L-oNKK1CrnU", help="ID of video to like.")
    args = parser.parse_args()
    main(args)

【讨论】:

  • 正如 OP 的第三个代码清单所示,argparser 确实使用了 stdlib 中的 argparse。另一个证明:github.com/google/oauth2client/blob/master/oauth2client/…。所以在使用oauth2client.tools.argparser时不需要初始化解析器。
  • 这不太对。您需要将 oath argparser 添加为父级,以将其选项添加到您的命令行中。
  • 好吧,虽然这可能不是一个好习惯,但我不明白为什么原则上你不能直接使用argparser。仅当您需要创建多个解析器时才会出现问题,然后每个解析器都需要将 argparser 作为父级。
  • @werkritter 在任何情况下我都在使用 argparser(比如这里 - chopapp.com/#e09u1te3)我遇到了错误。当我使用 argparse 实现自己的 argparser 时,包括来自 tools.py 模块 (github.com/google/oauth2client/blob/master/oauth2client/…) 的确切参数——一切正常。仅当我想使用他们的 argparser 时,它才起作用。这很奇怪。也许这真的是一个操作系统问题
  • 顺便说一句,当我使用 tools.py 的 argparser ArgumentError: argument --videoid: conflicting option string(s): --videoid
【解决方案2】:

来自auth2 docs

oauth2client.tools.run_flow() 函数由 命令行标志和 Python 标准库 argparse 模块 必须在程序开始时初始化。包括argparse 在 Python 2.7+ 中,可作为旧版的单独包使用 版本。下面举例说明如何使用该功能:

import argparse
from oauth2client import tools

parser = argparse.ArgumentParser(parents=[tools.argparser])
flags = parser.parse_args()

死而复生

原来的问题是在pdb等环境重启脚本后出现的。重新启动时,主脚本再次运行,但旧的导入脚本,包括对 oath2client.tools.argparser 的更改仍然存在。解决方案如文档中所述,使用 oauth2client 的解析器作为父项创建自己的解析器。这样,您只需将参数添加到在启动时重新创建的解析器。

【讨论】:

  • 虽然 OP 没有遵循文档中概述的做法,但您的回答并没有真正解决他的问题 - 当在 argparser 上调用 argparse.ArgumentParser.add_argument 时会引发错误,这应该是可能的原则上。
  • @werkritter 我已按照 Google 指南中的说明进行操作 — developers.google.com/youtube/v3/code_samples/…
  • @werkritter 我仔细查看了源代码,你是对的。这并不能解决问题!我会删除它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 2022-01-17
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
相关资源
最近更新 更多