2017-02-17 34 views
1

我需要脚本查看命令行中给出的参数,并在同一命令行中给出两个特定参数时给出错误输出。在getopt命令中查找多个参数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()) 
+0

为什么不设置一个简单的计数器递增时使用-b或-c是输入,然后测试该值是否大于1并显示错误? – grail

回答

2

首先,你应该使用argparse模块支持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() 
+0

嗨,感谢您的回复。我无法让它工作。为了测试目的,我把它放在下面的代码中:'import getopt import sys opts,args = getopt.getopt(sys.argv [1:],“habc”,[“help”,“Task_a”,“Task_b” ,“Task_c”]) 如果opts中的(“-b”,“--Task_b”)和opts中的(“-c”,“--Task_c”)opts: print(“ - b和-c是相互独占“,文件= sys.stderr) sys.exit() else: print(”Arguments are OK“) – nhrcpt

+0

显然我给你错了条件。我现在更新了答案。这将工作 –

+0

谢谢你Shiplu。这实际上是我正在寻找的。它很好地工作。 – nhrcpt

1

使用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) 
+1

如果使用argparse,为什么不使用'add_mutually_exclusive_group'? –

+0

感谢埃琳娜为您的解决方案。我对argparse不熟悉,所以我没有使用它,但是现在我可以看到在这种情况下使用它有多容易。做得好 !! – nhrcpt