我的脚本包含4个功能。其中两个需要争论。我正在尝试使用argparse创建一个简单的CLI,并可以从4个函数中选择任何一个进行调用。
当前,在尝试运行不需要参数的函数时,一切正常!但是,当尝试运行需要参数的其他函数时,出现错误。
usage: test.py fun3 [-h] -x X -y Y
test.py fun3: error: the following arguments are required: -x, -y
尝试从终端运行:
python test.py fun3 -x -y
import argparse
import sys
def fun1():
print('Foo')
def fun2():
print('Bar')
def fun3(x,y):
print(x + y)
def fun4(x,y):
print(x + y)
parser = argparse.ArgumentParser(description='Some stuff')
subparsers = parser.add_subparsers()
parser_fun1 = subparsers.add_parser('fun1', help='print Foo')
parser_fun1.set_defaults(func=fun1)
parser_fun2 = subparsers.add_parser('fun2', help='print Bar')
parser_fun2.set_defaults(func=fun2)
parser_fun3 = subparsers.add_parser('fun3', help='print x + y')
parser_fun3.set_defaults(func=fun3)
parser_fun3.add_argument('-x', type=int, required=True, help='def x')
parser_fun3.add_argument('-y', type=int, required=True, help='def y')
parser_fun4 = subparsers.add_parser('fun4', help='print x + y')
parser_fun4.set_defaults(func=fun4)
parser_fun4.add_argument('-x', type=int, required=True, help='def x')
parser_fun4.add_argument('-y', type=int, required=True, help='def y')
args = parser.parse_args()
if len(sys.argv) <= 1:
sys.argv.append('--help')
options = parser.parse_args()
options.func()
https://docs.python.org/3/library/argparse.html#sub-commands
注意函数带有args
参数
>>> # parse the args and call whatever function was selected
>>> args = parser.parse_args('foo 1 -x 2'.split())
>>> args.func(args)
2.0
在您的代码中,我添加了print(args)
和dest='cmd'
作为注释。
没有必需的参数,我从解析器中收到一条错误消息:
2106:~/mypy$ python3 stack57517701.py fun3
usage: stack57517701.py fun3 [-h] -x X -y Y
stack57517701.py fun3: error: the following arguments are required: -x, -y
输入正确的信息后,我现在从调用中得到错误消息fun3
:
2106:~/mypy$ python3 stack57517701.py fun3 -x 1 -y 2
Namespace(cmd='fun3', func=<function fun3 at 0x7facba5d60d0>, x=1, y=2)
Traceback (most recent call last):
File "stack57517701.py", line 43, in <module>
args.func()
TypeError: fun3() missing 2 required positional arguments: 'x' and 'y'
您定义fun3(x,y)
,但致电args.func()
。在x
和y
丢失。
我可以传递args
给您的函数,或者一般性的kwargs
:
def fun1(**kwargs):
print('Foo')
def fun3(x=0,y=0,**kwargs):
print(x + y)
然后打电话给 args.func(**vars(args))
2110:~/mypy$ python3 stack57517701.py fun3 -x 1 -y 2
Namespace(cmd='fun3', func=<function fun3 at 0x7f4bb264d0d0>, x=1, y=2)
3
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句