2015-02-10 34 views
0

我在Python中使用Argparse庫,並且需要檢索調用時傳遞的所有選項。例如,如果給定的程序需要三個命令行參數:Argparse:獲取在命令行中傳遞的所有選項

parser.add_argument('-a', action="store_true", default=False) 
parser.add_argument('-b', action="store", dest="b") 
parser.add_argument('-c', action="store", dest="c", type=int) 

所以,如果我叫python test.py -b 我需要一種方法來知道-b作爲命令行選項傳遞。

在老optparse這可以通過重寫optparse.Option做,但我無法找到它在argparse相當於

+1

它工作嗎?如果不是,會發生什麼? – 2015-02-10 15:25:29

+0

我不明白你想達到什麼目的,爲什麼argparse沒有做你所需要的。你能否做出更詳細的解釋? – 2015-02-10 15:26:48

+0

你有除了輸出的例子嗎? – 2015-02-10 16:08:47

回答

4

只是用於測試的默認值設置,如默認默認值None

if args.b is None: 
    # -b was not used 

這將不適用於-a,因爲store_true意味着默認False。你可以告訴​​使用None作爲默認而不是:

parser.add_argument('-a', action="store_true", default=None) 

但因爲你不能使用-a並有not args.a是真實的,你可以測試默認還是:

parser.add_argument('-a', action="store_true") 
args = parser.parse_args() 
if not args.a: 
    # -a was not used 

如果None是一個有效的選擇(比如,你使用action="store_const", const=None)默認使用不同的哨點:

_sentinel = object() 
parser.add_argument('-d', action="store_const", 
        const=None, default=_sentinel) 
args = parser.parse_args() 
if args.d is _sentinel(): 
    # -d was not used 

您還可以防止默認被設置,由默認設置爲argparse.SUPPRESS

parser.add_argument('-e', default=argparse.SUPPRESS) 
args = parser.parse_args() 
if not hasattr(args, 'e'): 
    # -e was not used 

可以列出實際使用使用遍歷parser._optionals._actions,看是否他們.dest屬性是所有可選的動作本,而不是設置爲.default值:

used_options = [ 
    action for action in parser._optionals._actions 
    if getattr(args, action.dest, action.default) is not action.default] 

演示:

>>> import argparse 
>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('-a', action="store_true", default=False) 
_StoreTrueAction(option_strings=['-a'], dest='a', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None) 
>>> parser.add_argument('-b', action="store", dest="b") 
_StoreAction(option_strings=['-b'], dest='b', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None) 
>>> parser.add_argument('-c', action="store", dest="c", type=int) 
_StoreAction(option_strings=['-c'], dest='c', nargs=None, const=None, default=None, type=<type 'int'>, choices=None, help=None, metavar=None) 
>>> def list_used_options(parser, args): 
...  return [ 
...   action for action in parser._optionals._actions 
...   if getattr(args, action.dest, action.default) is not action.default] 
... 
>>> args = parser.parse_args(['-a']) 
>>> list_used_options(parser, args) 
[_StoreTrueAction(option_strings=['-a'], dest='a', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)] 

這只是迴應什麼sys.argv[1:]已經告訴你通過了,當然。

+0

我需要存儲傳遞給命令行的所有參數列表中。可用選項是長列表,每個選項都沒有與之相關的默認值。如果你能幫助我,這將是感激的 – ujjwalwahi 2015-02-10 15:42:50

+0

@ujjwalwahi:傳遞給腳本的所有命令行選項已經可以作爲'sys.argv'中的列表。 – 2015-02-10 16:06:11

+0

@JoelCornett:不知何故,我認爲這還不夠好。擁有'Action'實例可以有它的用途,但是如果OP想要確切的命令行,那麼它確實已經在那裏了。 – 2015-02-10 16:08:03

0

檢查默認值是檢查是否給出(見過)選項的最直接的方法。默認的默認None在這方面很好,因爲你不能在命令行中給None。對於store_true(或false),默認值總是相反的布爾值。但是,我意識到使用這種默認並不總是方便(或可能)。

parse_args確實記錄變量中看到的選項,seen_actions。它使用這個集合來測試是否看到所有'必需'選項。對此組的改進seen_non_default_actions用於測試所需的互斥組。

但這兩套都不在parse_args之外。我已經開發了一個擴展了互斥組的概念的補丁。這將提供一個鉤子,可以在這些seen集上運行測試(在錯誤報告中查找標題中包含'nest inclusive groups'的錯誤報告)。