手动传递 argv 时如何让 ArgumentParser 表现相同
How do I get ArgumentParser to behave the same when passing argv manually
我想重构我必须维护的参数解析函数,并使用从测试套件传递的参数来测试调用它的更改,但我发现代码的行为与使用 sys.argv
默认
这是显示问题的最小复制品。
- 使用默认值 (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'])
符合预期。
- 将 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
我想重构我必须维护的参数解析函数,并使用从测试套件传递的参数来测试调用它的更改,但我发现代码的行为与使用 sys.argv
默认
这是显示问题的最小复制品。
- 使用默认值 (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'])
符合预期。
- 将 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