2014-09-21 65 views
-1

我修改這裏給出的示例代碼: sample code for getopt與getopt的Python的命令行參數不起作用

如下,但它不工作。我不知道我錯過了什麼。我爲這個現有的代碼添加了一個「-j」選項。最終,我想添加儘可能多的命令選項以滿足我的需求。

當我輸入如下,它不會打印任何東西。

./pyopts.py -i dfdf -j qwqwqw -o ddfdf 
Input file is " 
J file is " 
Output file is " 

請問我能告訴我這裏有什麼問題嗎?

#!/usr/bin/python 

import sys, getopt 

def usage(): 
    print 'test.py -i <inputfile> -j <jfile> -o <outputfile>' 

def main(argv): 
    inputfile = '' 
    jfile = '' 
    outputfile = '' 
    try: 
     opts, args = getopt.getopt(argv,"hij:o:",["ifile=","jfile=","ofile="]) 
    except getopt.GetoptError: 
     usage() 
     sys.exit(2) 
    for opt, arg in opts: 
     if opt == '-h': 
     usage() 
     sys.exit() 
     elif opt in ("-i", "--ifile"): 
     inputfile = arg 
     elif opt in ("-j", "--jfile"): 
     jfile = arg 
     elif opt in ("-o", "--ofile"): 
     outputfile = arg 

    print 'Input file is "', inputfile 
    print 'J file is "', jfile 
    print 'Output file is "', outputfile 

if __name__ == "__main__": 
    main(sys.argv[1:]) 
+4

請勿使用getopt。使用argparse。 – 2014-09-21 17:04:23

+0

我很驚訝'getopt'尚未被棄用。 – simonzack 2014-09-21 17:15:09

+0

可能因爲它從來沒有打算成爲解析選項的主要方法;它只是作爲來自C的用戶的墊腳石而已。這幾乎是自我否定的:) – chepner 2014-09-21 17:32:25

回答

4

您的錯誤在i選項後面省略冒號。正如您提供的鏈接所述:

需要參數的選項後面應跟冒號(:)。

因此,你的程序的修正版本應包含以下內容:

try: 
     opts, args = getopt.getopt(argv,"hi:j:o:",["ifile=","jfile=","ofile="]) 
    except getopt.GetoptError: 
     usage() 
     sys.exit(2) 

用指定的參數執行它獲得預期的輸出:

~/tmp/so$ ./pyopts.py -i dfdf -j qwqwqw -o ddfdf 
Input file is " dfdf 
J file is " qwqwqw 
Output file is " ddfdf 

但是,作爲一個評論您的問題指定,您應該使用argparse而不是getopt

注意: getopt模塊是命令行選項的解析器,其API設計爲讓C getopt()函數的用戶熟悉。不熟悉C getopt()函數的用戶,或者希望編寫更少代碼並獲得更好幫助和錯誤消息的用戶應該考慮使用argparse模塊。