Argparse位置参数sequest

时间:2013-08-16 08:55:11

标签: argparse

我正在尝试使用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我得到“错误:无法识别的参数:filename”

如果我的cmd行是pgm filename --error它没有错误。

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

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

1 个答案:

答案 0 :(得分: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 ...]]的{​​{1}}部分。

usage发生的事情是pgm --error filename字符串同时设置pgmprog='pgm'。使用library=[](或*),?对完全没有字符串感到满意。完成后,它没有地方放置library字符串。

filename给出pgm filename --errorlibrary=['filename']也应该有用。

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

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

的这种互动

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


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