当手动传递argv时,我如何使ArgumentParser的行为相同



我想重构一个必须维护的参数解析函数,并使用从测试套件传递的参数来测试我调用它的更改,但我发现代码的行为与默认情况下使用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

相关内容

  • 没有找到相关文章

最新更新