我正在尝试使用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是可选的。
答案 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
字符串同时设置pgm
和prog='pgm'
。使用library=[]
(或*
),?
对完全没有字符串感到满意。完成后,它没有地方放置library
字符串。
filename
给出pgm filename --error
。 library=['filename']
也应该有用。
问题不在于postionals必须是第一个(或最后一个),但它们必须在一起(如果第二个是'?'或'*')。
此错误报告帖子试图解释'*'位置和选项
的这种互动http://bugs.python.org/issue14191#msg185517
如果--error pgm filename
是程序名pgm
,那么您在argparse中不需要它。删除sys.argv[0]
参数,问题消失(然后只有一个位置)。