我想立刻获取所有剩余的未使用的参数。我该怎么做?
parser.add_argument('-i', action='store', dest='i', default='i.log')
parser.add_argument('-o', action='store', dest='o', default='o.log')
答案 0 :(得分:71)
args, unknownargs = parser.parse_known_args()
答案 1 :(得分:36)
parser.add_argument('rest', nargs=argparse.REMAINDER)
示例:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-i', action='store', dest='i', default='i.log')
parser.add_argument('-o', action='store', dest='o', default='o.log')
parser.add_argument('rest', nargs=argparse.REMAINDER)
parser.parse_args(['hello', 'world'])
>>> Namespace(i='i.log', o='o.log', rest=['hello', 'world'])
答案 2 :(得分:19)
我去编写了这个帖子中作为答案给出的三个建议。测试代码显示在此答案的底部。结论:到目前为止,最好的全能答案是nargs=REMAINDER
,但它可能真的取决于您的使用案例。
以下是我观察到的差异:
(1)nargs=REMAINDER
赢得用户友好性测试。
$ python test.py --help
Using nargs=* : usage: test.py [-h] [-i I] [otherthings [otherthings ...]]
Using nargs=REMAINDER : usage: test.py [-h] [-i I] ...
Using parse_known_args : usage: test.py [-h] [-i I]
(2)nargs=*
在命令行上静默过滤出第一个--
参数,这看起来很糟糕。另一方面,所有方法都尊重--
作为一种表达方式"请不要将这些字符串解析为已知的args。"
$ ./test.py hello -- -- cruel -- -- world
Using nargs=* : ['hello', '--', 'cruel', '--', '--', 'world']
Using nargs=REMAINDER : ['hello', '--', '--', 'cruel', '--', '--', 'world']
Using parse_known_args : ['hello', '--', '--', 'cruel', '--', '--', 'world']
$ ./test.py -i foo -- -i bar
Using nargs=* : ['-i', 'bar']
Using nargs=REMAINDER : ['--', '-i', 'bar']
Using parse_known_args : ['--', '-i', 'bar']
(3)除parse_known_args
之外的任何方法如果试图解析以-
开头的字符串并且结果证明无效,则除外。
$ python test.py -c hello
Using nargs=* : "unrecognized arguments: -c" and SystemExit
Using nargs=REMAINDER : "unrecognized arguments: -c" and SystemExit
Using parse_known_args : ['-c', 'hello']
(4)nargs=REMAINDER
在遇到第一个未知参数时完全停止解析。 parse_known_args
会吞噬已知"已知"的论点,无论它们出现在哪一行(并且如果它们看起来格格不入就会死亡)。
$ python test.py hello -c world
Using nargs=* : "unrecognized arguments: -c world" and SystemExit
Using nargs=REMAINDER : ['hello', '-c', 'world']
Using parse_known_args : ['hello', '-c', 'world']
$ python test.py hello -i world
Using nargs=* : ['hello']
Using nargs=REMAINDER : ['hello', '-i', 'world']
Using parse_known_args : ['hello']
$ python test.py hello -i
Using nargs=* : "error: argument -i: expected one argument" and SystemExit
Using nargs=REMAINDER : ['hello', '-i']
Using parse_known_args : "error: argument -i: expected one argument" and SystemExit
这是我的测试代码。
#!/usr/bin/env python
import argparse
import sys
def using_asterisk(argv):
parser = argparse.ArgumentParser()
parser.add_argument('-i', dest='i', default='i.log')
parser.add_argument('otherthings', nargs='*')
try:
options = parser.parse_args(argv)
return options.otherthings
except BaseException as e:
return e
def using_REMAINDER(argv):
parser = argparse.ArgumentParser()
parser.add_argument('-i', dest='i', default='i.log')
parser.add_argument('otherthings', nargs=argparse.REMAINDER)
try:
options = parser.parse_args(argv)
return options.otherthings
except BaseException as e:
return e
def using_parse_known_args(argv):
parser = argparse.ArgumentParser()
parser.add_argument('-i', dest='i', default='i.log')
try:
options, rest = parser.parse_known_args(argv)
return rest
except BaseException as e:
return e
if __name__ == '__main__':
print 'Using nargs=* : %r' % using_asterisk(sys.argv[1:])
print 'Using nargs=REMAINDER : %r' % using_REMAINDER(sys.argv[1:])
print 'Using parse_known_args : %r' % using_parse_known_args(sys.argv[1:])
答案 3 :(得分:13)
另一个选择是向解析器添加位置参数。指定不带前导破折号的选项,argparse
将在未识别其他选项时查找它们。
这具有改进命令的帮助文本的附加好处:
>>> parser.add_argument('otherthings', nargs='*')
>>> parser.parse_args(['foo', 'bar', 'baz'])
Namespace(i='i.log', o='o.log', otherthings=['foo', 'bar', 'baz'])
和
>>> print parser.format_help()
usage: ipython-script.py [-h] [-i I] [-o O] [otherthings [otherthings ...]]
positional arguments:
otherthings
optional arguments:
-h, --help show this help message and exit
-i I
-o O