手动传递 argv 时如何让 ArgumentParser 表现相同

How do I get ArgumentParser to behave the same when passing argv manually

我想重构我必须维护的参数解析函数,并使用从测试套件传递的参数来测试调用它的更改,但我发现代码的行为与使用 sys.argv 默认 这是显示问题的最小复制品。

  1. 使用默认值 (sys.argv):
import argparse
import sys

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("-f", dest="foo", required=True,
                        help="Set Foo")
    parser.add_argument('inputfiles', nargs=argparse.REMAINDER)
    print("Parsing arguments: {}".format(sys.argv))
    args = parser.parse_args()

    print("Args: {}".format(args))

if __name__ == '__main__':
    parse_args()

调用这个我得到:

$ python ./test_argparse_def.py -f foo bar fizzbuzz
Parsing arguments: ['./test_argparse_def.py', '-f', 'foo', 'bar', 'fizzbuzz']
Args: Namespace(foo='foo', inputfiles=['bar', 'fizzbuzz'])

符合预期。

  1. 将 sys.argv 作为参数传入(即根据我的理解,它应该使用相同的输入)并使用参数而不是默认值。
def parse_args(argv):
    parser = argparse.ArgumentParser(prog=argv[0])
    parser.add_argument("-f", dest="foo", required=True,
                        help="Set Foo")
    parser.add_argument('inputfiles', nargs=argparse.REMAINDER)
    print("Parsing arguments: {}".format(argv))
    args = parser.parse_args(argv)

    print("Args: {}".format(args))

if __name__ == '__main__':
    parse_args(sys.argv)

这给出:

$ python ./test_argparse.py -f foo bar fizzbuzz
Parsing arguments: ['./test_argparse.py', '-f', 'foo', 'bar', 'fizzbuzz']
usage: ./test_argparse.py [-h] -f FOO ...
./test_argparse.py: error: the following arguments are required: -f

这给出了意外错误,因为提供了 -f。

我在这里是否错误地使用了 ArgumentParser?有没有办法让它在第二种情况下的行为与第一种情况相同? 我已经确认问题出现在 python 3.5 和 python 3.7

使用

if __name__ == '__main__':
    parse_args(sys.argv[1:])  <-- changed