在Python脚本中获取命令行参数的最佳方法 [英] Best way to take Command Line Arguments in Python Script

查看:0
本文介绍了在Python脚本中获取命令行参数的最佳方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的Python脚本中,我有很多命令行参数。其中一些是强制性的,而另一些是可选的。对于某些强制参数的值,某些可选参数也是必需的。在这种命令行参数的情况下,采用什么是最好的方法。我正在使用argparse.Argumentparser以达到我的目的。

为了阐明用例,下面是一个示例。假设我有3个强制参数:mode, foo, bar和5个可选参数:op1, op2, op3, op4, op5。假设mode可以有3个值:m1, m2, m3。如果modem1,则op1 and op2为必填项。如果modem2,则op3为必填项;如果modem3,则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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆