【问题标题】:Argparse positional parameter sequestargparse 位置参数序列
【发布时间】:2013-08-16 08:55:10
【问题描述】:

我正在尝试使用 argparse,但我一直遇到问题,由于某种原因,我的位置参数必须位于命令行的首位。我希望位置在最后,因为它是文件名列表。

    self.parser = ArgumentParser(description=program_license,
                     formatter_class=RawDescriptionHelpFormatter,
                     conflict_handler='resolve')
    self.parser.add_argument('-V', '--version',
                     action='version',
                     version=program_version_message)
    self.parser.add_argument('--logfile', action='store',
                     dest='logfile', default='daddyvision.log')
    self.parser.add_argument('prog', help=SUPPRESS, nargs=1)
    self.parser.add_argument('library', metavar="library", nargs='*')

    group_loglvl = self.parser.add_mutually_exclusive_group()
    group_loglvl.add_argument("--verbose", dest="loglevel",
                     action="store_const", const="VERBOSE",
                     default='INFO')
    group_loglvl.add_argument("--debug", dest="loglevel",
                     action="store_const", const="DEBUG")
    group_loglvl.add_argument("--trace", dest="loglevel",
                     action="store_const", const="TRACE")
    group_loglvl.add_argument("--quiet", dest="loglevel",
                     action="store_const", const="WARNING")
    group_loglvl.add_argument("--errors", dest="loglevel",
                     action="store_const", const="ERROR")

    args = self.parser.parse_args(arg)

如果我的命令行是:pgm --error filename 我得到“错误:无法识别的参数:文件名”

如果我的 cmd 行是 pgm filename --error 它可以正常工作。

我做错了什么。我读过的所有内容都让我相信位置可以排在第一位,也可以排在最后。 Python 2.7 环境。

如果我设置位置要求 (nargs='+') 它可以工作,但参数是可选的。

【问题讨论】:

标签: argparse


【解决方案1】:

如果您清理代码并删除 self 之类的内容,则测试代码会更容易。我喜欢做import argparse,然后可以粘贴其余部分,并获得一个运行示例。

你如何测试这个?

parser.parse_args('pgm --error filename'.split())

或

parser.parse_args('--error filename'.split())

parser.parse_args() 解析 sys.argv[1:]。如果我用这个 argparse 运行一个名为 pgm 的脚本,我希望解析 --error filename。

帮助,没有 SUPPRESS 是:

usage: ipython [-h] [-V] [--logfile LOGFILE]
               [--verbose | --debug | --trace | --quiet | --errors]
               prog [library [library ...]]

positional arguments:
  prog
  library

optional arguments:
  -h, --help         show this help message and exit
  ...
  --errors

无论如何,您的错误的关键是usage 的prog [library [library ...]] 部分。

pgm --error filename 的情况是pgm 字符串同时设置了prog='pgm' 和library=[]。使用*(或?),library 完全满足于没有字符串。完成后,它就没有地方放置filename 字符串了。

pgm filename --error 给出library=['filename']。 --error pgm filename 也应该可以工作。

问题不在于分词必须是第一个(或最后一个),而是它们必须在一起(如果第二个是“?”或“*”)。

此错误报告帖子试图解释 '*' 位置和可选项的交互

http://bugs.python.org/issue14191#msg185517


如果pgm 是程序名sys.argv[0],那么在argparse 中不需要它。删除prog 参数,您的问题就消失了(那么只有一个位置)。

【讨论】:

  • 当我通过 sys.argv(),没有 pgm 条目时,我将 sys.argv[0] 作为库列表中的第一个条目。
  • sys.argv() 给出错误。如果您想将sys.argv 传递给parse_args,请使用sys.argv[1:] - 即除sys.argv[0] 之外的所有内容。
猜你喜欢
  • 2011-05-27
  • 2011-05-27
  • 2016-01-08
  • 2015-07-25
  • 2012-10-21
  • 2023-04-02
  • 2013-01-24
相关资源
最近更新 更多