在Python脚本中获取命令行参数的最佳方法 [英] Best way to take Command Line Arguments in Python Script
本文介绍了在Python脚本中获取命令行参数的最佳方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在我的Python脚本中,我有很多命令行参数。其中一些是强制性的,而另一些是可选的。对于某些强制参数的值,某些可选参数也是必需的。在这种命令行参数的情况下,采用什么是最好的方法。我正在使用argparse.Argumentparser
以达到我的目的。
为了阐明用例,下面是一个示例。假设我有3个强制参数:mode, foo, bar
和5个可选参数:op1, op2, op3, op4, op5
。假设mode
可以有3个值:m1, m2, m3
。如果mode
为m1
,则op1 and op2
为必填项。如果mode
为m2
,则op3
为必填项;如果mode
为m3
,则op4 and op5
为必填项。
将其转化为代码的最佳方式是什么?我现在所做的似乎太详尽了,我只是觉得必须有更好的方法来做到这一点。
->;当前代码
import argparse
# create and execute parser
my_parser = argparse.ArgumentParser(description="Demo")
my_parser.add_argument("--mode", action="store", type=str, required=True)
my_parser.add_argument("--foo", action="store", type=str, required=True)
my_parser.add_argument("--bar", action="store", type=str, required=True)
my_parser.add_argument("--op1", action="store", type=str, required=False, default=None)
my_parser.add_argument("--op2", action="store", type=str, required=False, default=None)
my_parser.add_argument("--op3", action="store", type=str, required=False, default=None)
my_parser.add_argument("--op4", action="store", type=str, required=False, default=None)
my_parser.add_argument("--op5", action="store", type=str, required=False, default=None)
args = my_parser.parse_args()
try:
if args.mode == "m1":
op1 = args.op1.lower()
op2 = args.op2.lower()
if args.mode == "m2":
op3 = args.op3.split(',')
if args.mode == "m3":
op4 = args.op4.lower()
op5 = args.op5.lower()
except AttributeError:
print("Wrong mode set for optional arguments")
exit()
如您所见,即使这个示例看起来也很糟糕(特别是try
块解析),在我的例子中有很多可选的参数需要处理。任何帮助都将不胜感激。
此外,这种方法不会强制用户输入,例如,如果他的mode=m1
,则输入op1 and op2
。如果也有可能做这样的事情,那对我来说将是额外的好处。
谢谢。
推荐答案
您的程序似乎正在处理多个不同的任务。支持这一点的方法是将解析器拆分为sub-commands:
import argparse
parser = argparse.ArgumentParser(description="Demo")
parser.add_argument("--foo", required=True)
parser.add_argument("--bar", required=True)
subparsers = parser.add_subparsers(dest='mode', required=True)
m1_parser = subparsers.add_parser('m1', help='mode 1')
m1_parser.add_argument("--op1", required=True)
m1_parser.add_argument("--op2", required=True)
m1_parser.add_argument("--op3")
m1_parser.add_argument("--op4")
m1_parser.add_argument("--op5")
m2_parser = subparsers.add_parser('m2', help='mode 2')
m2_parser.add_argument("--op1")
m2_parser.add_argument("--op2")
m2_parser.add_argument("--op3", required=True)
m2_parser.add_argument("--op4")
m2_parser.add_argument("--op5")
m3_parser = subparsers.add_parser('m3', help='mode 3')
m3_parser.add_argument("--op1")
m3_parser.add_argument("--op2")
m3_parser.add_argument("--op3")
m3_parser.add_argument("--op4", required=True)
m3_parser.add_argument("--op5", required=True)
args = parser.parse_args()
if args.mode == 'm1':
print(args.op1) # it will always exist
用法:
$ python3 args.py m1
usage: args.py m1 [-h] --op1 OP1 --op2 OP2 [--op3 OP3] [--op4 OP4] [--op5 OP5]
args.py m1: error: the following arguments are required: --op1, --op2
虽然这似乎是重复的,但您现在可以选择为特定于子命令的各种选项指定更好的名称。
这篇关于在Python脚本中获取命令行参数的最佳方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文