我有一个脚本,它接受一些参数,使用其中一些参数来选择要运行的脚本,并将其余参数传递给该脚本。所以它看起来像这样:
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
来解决这个问题?
答案 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