有argparse收集,但没有响应,标志

时间:2014-10-08 19:24:16

标签: python argparse

我有一个脚本,它接受一些参数,使用其中一些参数来选择要运行的脚本,并将其余参数传递给该脚本。所以它看起来像这样:

parser = ArgumentParser()
parser.add_argument('script', choices['a', 'b'])
parser.add_argument('rest_args', nargs='*')
args = parser.parse_args()
if args.script == 'a':
    subprocess.call('python a.py %s' % ' '.join(args.rest_args))
else:
    subprocess.call('python b.py %s' % ' '.join(args.rest_args))

除非我想传递以-开头的参数,否则这样可以正常工作。例如,如果我调用python my_script.py a --foo,我会收到错误unrecognized arguments,当我真的想让它运行python a.py --foo时(即只需将--foo传递给子过程)。

有没有办法通过argparse来解决这个问题?

3 个答案:

答案 0 :(得分:5)

也许您正在寻找parse_known_args。它将解析它识别的所有选项,并返回unknown中所有无法识别的参数:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('script', choices=['a', 'b'])

args, unknown = parser.parse_known_args(['a', '--foo'])

print(args)
# Namespace(script='a')
print(unknown)
# ['--foo']

答案 1 :(得分:1)

我发现了函数parse_known_args,它为此提供了解决方案,虽然可能并不理想。

parser = ArgumentParser()
parser.add_argument('script', choices['a', 'b'])
args, rest_args = parser.parse_known_args()
if args.script == 'a':
    subprocess.call('python a.py %s' % ' '.join(rest_args))
else:
    subprocess.call('python b.py %s' % ' '.join(rest_args))

这样做是使用parse_known_args来解析已知的内容,并在列表中收集其余内容。然后可以根据需要将剩余的参数传递给子进程。

答案 2 :(得分:0)

如果您在参数列表中包含'*',则'--'有效:

1502:~/mypy$ python2.7 stack26264831.py a -- --foo bar
Namespace(rest_args=['--foo', 'bar'], script='a')

另一种方法是使用REMAINDER(' ...')代替' *':

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('script', choices=['a', 'b'])
parser.add_argument('rest_args', nargs=argparse.REMAINDER)
args = parser.parse_args()
print args

1500:~/mypy$ python2.7 stack26264831.py a --foo bar
Namespace(rest_args=['--foo', 'bar'], script='a')

' - '和REMAINDER意味着:'将后面的内容视为位置参数'。

parse_known_args也有效,虽然它的逻辑不同 - 只需返回一个你不认识的字符串列表'。 parse_args调用parse_known_args并引发错误,rest值不为空。


但请勿使用REMAINDER作为第一个位置参数:Using argparse.REMAINDER at beginning of parser / sub parser