0

我正在尝试使用 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='+') 它可以工作,但参数是可选的。

4

1 回答 1

0

如果您清理代码,删除诸如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

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

发生的事情pgm --error filenamepgm字符串同时设置了prog='pgm'library=[]。使用*(或?),library完全不满足任何字符串。完成后,它就没有地方放置filename字符串了。

pgm filename --errorlibrary=['filename']. --error pgm filename也应该工作。

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

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

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


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

于 2013-08-17T02:51:37.943 回答