2013-11-25 96 views
1

我處於死衚衕。我試圖將參數傳遞給Linux來運行某些操作。我想避免用戶輸入太多的參數。Python getopt太多爭論

例如腳本所需的運行將是這樣:

./audit.py -a 

我想阻止以下內容:

./audit.py -af 

這似乎運行無論是指定「一」然後'f'。在這種情況下,如果它像'-af'那麼我需要它退出sys.exit()。我LEN(sys.argv中[1:])總是產生結果1,無論我多麼參數放在

import getopts 
import sys 
def main(): 
    try: 
     opts, args = getopt.getopt(sys.argv[1:], 'v:adfh') 
    except getopt.GetoptError as err: 
     sys.exit(str(err)) 
    if len(sys.argv[1:]) != 1: 
     sys.exit('Invalid') 

    for o,a in opts: 
     if o in ('-v', '--volume'): 
      print 'Volumes' 
     elif len(sys.argv[2:]) != 0: 
      sys.exit('Too many arguments') 
     elif o in ('-a', '--agent'): 
      print 'Full audit of agents only' 
     elif o in ('-d', '--device'): 
      print 'Full audit of device only' 
     elif o in ('-f', '--full'): 
      print 'Full audit of device/agents' 
     elif o in ('-h', '--help'): 
      sys.exit('Help Section') 
if __name__ == '__main__': 
    main() 
+1

如果你想檢查指定了多少個選項,爲什麼不檢查'opts'? – user2357112

+0

只是爲了我的理解:爲什麼你不想阻止選項的聚類? –

回答

0

sys.argv[1:] is ['-af']的價值,如果你將檢查的lenght [「-af」]。是1,這就是爲什麼if len(sys.argv[1:]) != 1:總是錯誤的原因。相反,如果你想檢查第一個參數的長度,你需要使用len(sys.argv[1:][0])或者其他參數長度。

0

問題是sys.argv[1:]產生切片。換句話說,這是一個列表。在你的情況下,它就像['-af']。所以當然,除非你沒有傳入任何參數,否則長度總是1。也許你打算這樣做:

if not all(i < 1 for i in sys.argv[1:]): 
    sys.exit('Invalid') 
0

你正在看選項集羣。在getopt似乎沒有任何設施禁用此功能。不過,無論如何,你可能不應該使用這個包。 argparse也許會更適合您的需求?

0

不是一個完整的答案,但你可能會很高興看看我很高興找到一個圖書館。

docopts - 沒有描述如何使用

這是一個偉大的工具,你剛纔描述的模塊文件部分,e.g你的論點一個偉大的視頻;

''' 
Usage: 
    myprog -a -v <volumes>... 
    myprog -f 
    myprog -h | --help 
''' 
import docopt 
args=docopt.docopt(__doc__) 

這將產生以下詞典如果運行作爲myprog -a -v one two three;

 
{ 
    "--help": false, 
    "-a": true, 
    "-f": false, 
    "-h": false, 
    "-v": true, 
    "": [ 
    "myprog", 
    "one", 
    "two", 
    "three" 
    ] 
}