我是Argparse模块的新手。我几乎完成了我的剧本,但有些东西我找不到办法去做。
这是脚本:
import argparse
def function1(a, b, c):
#mystaff
def function2(e, f):
#mystaff
def function3(g):
#mystaff
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='blahblah')
parser.add_argument('-a','--a', help='blahblah', required=False, default="defaultvalue")
parser.add_argument('-b','--b', help='blahblah', required=False)
.......
args = parser.parse_args()
function1(args.a,args.b,args.c)
我想从命令提示符调用脚本。现在,我可以使用它来调用function1
:
python myscript.py -a <var>
我想要的是:
python myscript.py -a <var>
:现在调用function1
python myscript.py function2 -c <var>
:仅调用function2
python myscript.py function3 -g <var>
:仅调用function3
因此,如果我没有指定函数,则function1是默认值,否则我也必须从命令提示符传递函数名。有什么想法吗?
答案 0 :(得分:4)
默认子命令
如果你想拥有子命令,并且如果没有指定子命令,则使其中一个是默认的,那么你就不能使用典型的subparser方法。
你需要在两遍中完成你的argparse:
parser = ArgumentParser()
parser.add_argument("function",
nargs="?",
choices=['function1', 'function2', 'function2'],
default='function1',
)
args, sub_args = parser.parse_known_args()
if args.function == "function1":
parser = ArgumentParser()
parser.add_argument('-a','--a')
parser.add_argument('-b','--b')
parser.add_argument('-c','--c')
args = parser.parse_args(sub_args)
function1(args.a, args.b, args.c)
elif args.function == "function2":
...
elif args.function == "function3":
...
处理--help
如果您希望--help
选项有用,则需要做更多工作:
这应该可以解决问题:
# Parse the subcommand argument first
parser = ArgumentParser(add_help=False)
parser.add_argument("function",
nargs="?",
choices=['function1', 'function2', 'function2'],
)
parser.add_argument('--help', action='store_true')
args, sub_args = parser.parse_known_args(['--help'])
# Manually handle help
if args.help:
# If no subcommand was specified, give general help
if args.function is None:
print parser.format_help()
sys.exit(1)
# Otherwise pass the help option on to the subcommand
sub_args.append('--help')
# Manually handle the default for "function"
function = "function1" if args.function is None else args.function
# Parse the remaining args as per the selected subcommand
parser = ArgumentParser(prog="%s %s" % (os.path.basename(sys.argv[0]), function))
if function == "function1":
parser.add_argument('-a','--a')
parser.add_argument('-b','--b')
parser.add_argument('-c','--c')
args = parser.parse_args(sub_args)
function1(args.a, args.b, args.c)
elif function == "function2":
...
elif function == "function3":
...
答案 1 :(得分:0)
parser.add_argument('-a','--a', dest='action', action='store_const', const=function1)
调用您需要添加const=function1
您可以在problem看到正确答案
答案 2 :(得分:0)
你可以这样做。使用set_defaults(func = your_function)
_parser = argparse.ArgumentParser(description="blalbabla awesome Framework")
_subparsers = _parser.add_subparsers(help="sub command help")
_check_parser = _subparsers.add_parser("check", help="check the code")
_check_parser.add_argument("--script_path", help="can be a python file or dir", required=True)
_check_parser.add_argument("--verbose", help='turn on debug level logging', action='store_true', default=False)
_check_parser.set_defaults(func=do_function)
def do_function(args):
if args.script_path is file:
xxxx
然后你可以正确访问do_function()