在 getopt 命令中查找多个参数 Python 3

Find multiple arguments in getopt command Python 3

我需要脚本来查看命令行中给出的参数,并在同一命令行中给出两个特定参数时给出错误输出。

请注意参数 b 和 c 是互斥的。

我需要一种方法,如果在命令行中同时给出 -b 和 -c,系统将提供错误消息并退出。另外有没有其他方法可以写代码?

谢谢,NH

我的示例代码是这样的:

import getopt

def main():
    x = ''

    try:
            opts, args = getopt.getopt(sys.argv[1:], "habc",["help","Task_a", "Task_b", "Task_c"])
    except getopt.GetoptError:
            print("Wrong Parameter")
            sys.exit()
    for opt, args in opts:
        if opt in ("-h", "--help"):
            x = "h"

        elif opt in ("-a", "--Task_a"):
            x= "a"

        elif opt in ("-b", "--Task_b"):
            x = "b"

        elif opt in ("-c", "--Task_c"):
            x = "c"

        else:
            x = "something Else"

    return x 
if __name__ =="main":
    main()
print(main())

首先,你应该使用argparse module that support mutual exclusion

要回答您的问题,您可以使用这个简单的逻辑

optnames = [opt[0] for opt in opts]
if (("-b" in optnames or "--Task-b" in optnames) and
        ("-c" in optnames or "--Task-c" in optnames)):
    print("-b and -c are mutually exclusive", file=sys.stderr)
    sys.exit()

为此使用 argparse

这里有一个简单的例子来让它工作:

parser = argparse.ArgumentParser(description='Doing some tasks')
parser.add_argument('-b', action='store_true', help="Proceed to task B")
parser.add_argument('-c', action='store_true', help="Proceed to task C")

args = parser.parse_args('-b -c'.split())

if args.b and args.c:
   sys.exit()

if args.b:
    # do something
if args.c:
    # do something else

编辑: 您还可以使用互斥组。感谢您的建议 shiplu

parser = argparse.ArgumentParser(description='Doing some tasks')
group = parser.add_mutually_exclusive_group()
group.add_argument('-b', action='store_true', help="Proceed to task B")
group.add_argument('-c', action='store_true', help="Proceed to task C")

然后当您尝试输入两个参数时:

In [80]: args=parser.parse_args('-b -c'.split())
usage: ipython [-h] [-b | -c]
ipython: error: argument -c: not allowed with argument -b
An exception has occurred, use %tb to see the full traceback.

SystemExit: 2

否则,

In [82]: parser.parse_args('-b'.split())
Out[82]: Namespace(b=True, c=False)

In [83]: parser.parse_args('-c'.split())
Out[83]: Namespace(b=False, c=True)