2016-11-20 30 views
4

我使用argparse在Python 2.7腳本以下參數解析器:Python argparse真/假和字符串的多功能性?

parser = argparse.ArgumentParser(description=scriptdesc) 
parser.add_argument("-l", "--list", help="Show current running sesssions", dest="l_list", type=str, default=None) 

我希望能夠運行:

./script -l和./script -l session_1

這樣腳本返回要麼所有會話或單個會話而沒有額外的參數,如-s

豪我無法找到一種方法來做到這一點在一個單一的參數。

回答

1

這是一個黑客位的,因爲它依賴於訪問sys.argv以外的任何​​功能,但你可以這樣做:

import argparse 
import sys 


parser = argparse.ArgumentParser(description='') 
parser.add_argument("-l", "--list", help="Show current running sesssions", dest="l_list", nargs='?') 
args = parser.parse_args() 

if args.l_list == None: 
    if '-l' in sys.argv or '--list' in sys.argv: 
     print('display all') 
else: 
    print('display %s only' %args.l_list) 

你顯然會替換爲您的實際代碼打印報表。這通過允許0或1個參數(使用nargs='?')工作。這允許您通過-l或不通過參數。這意味着如果在沒有參數的情況下調用-l或者根本不使用-l,則args名稱空間中的l_list可以是None(默認值)。然後,您可以稍後檢查是否在不帶參數的情況下調用-l(如果l_list == None-l--list位於sys.argv)。

如果我將該腳本命名爲test.py當從命令行調用它時,我會得到以下輸出。

$python test.py 
$python test.py -l 
display all 
$python test.py -l session1 
display session1 only 

EDIT

我想出一個argparse唯一的解決方案!!無依託sys.argv

import argparse 

parser = argparse.ArgumentParser(description='') 
parser.add_argument("-l", "--list", help="Show current running sesssions", dest="l_list", nargs='?', default=-1) 
args = parser.parse_args() 

if args.l_list == None: 
    print('display all') 
elif args.l_list != -1: 
    print('display %s only' %args.l_list) 

所以事實證明,當參數標誌不是所有稱爲.add_argumentdefault關鍵字才適用。如果該標誌在沒有任何後續使用的情況下使用,則無論default關鍵字是什麼,它都將默認爲None。因此,如果我們設置默認的東西,是不是None,而不是預期的參數值(在這種情況下,我選擇了-1),那麼我們就可以處理所有你的三個情況:

$ python test.py 
$ python test.py -l 
display all 
$ python test.py -l session1 
display session1 only 
+0

謝謝,這是類似解決方法 - 我有興趣,如果有一個argparse唯一的解決方案 - 謝謝。 – user7186882

+0

@ user7186882我想出了一個唯一的方法。檢查編輯 – bunji

+0

聰明 - 我已經嘗試了默認參數,並看到它被設置爲無,並且默認從未被使用 - 我認爲這是你的組合和默認值!謝謝! – user7186882