2017-02-17 36 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