2014-01-28 34 views
1

記錄在ARG列表選項的索引我想獲得/索引記錄到sys.argv列表的選項進行解析如何獲取/時argparse

我想換另一程序與一個python腳本。 而在包裝腳本中,我試圖解析與腳本 有關的選項,並將它們從argv列表中刪除,以便我可以將其餘參數傳遞給正在包裝的程序。

爲此,我使用了parser.parse_known_args(),以便我不必跟蹤程序可能支持的每個參數。只是那些重要的包裝。

現在,如果解析記錄了需要刪除的參數索引 我可以在解析後刪除它們,並將剩餘的參數傳遞給包裝的程序。

如何在解析過程中記錄此信息?

並非所有對包裝器有意義的參數都應該被刪除。所以我需要有選擇性

回答

1

parse.parse_known_args返回2個值,namespace包含它知道的參數以及它無法處理的字符串列表。我認爲rest列表就是你想要傳遞給其他程序的東西。

換句話說:

[args1, rest] = parser1.parse_known_args() # or (sys.argv[1:]) 
args = parser2.parse_args(rest) 

如果你不能給parser2的參數的顯式列表(例如,它被編碼爲parse_args()),那麼你需要做的,做這樣的事情:

sys.argv[1:] = rest 

我再次看着​​,_parse_known_args的內部。它遍歷參數字符串幾次。消耗字符串的循環使用while start_index<max_index:start_index根據每個參數的nargs增加不同的金額。它實際上指向用於特定參數的第一個字符串(例如-f標誌)。但它的價值沒有給action函數(您可以自定義)。它也不記錄在任何地方。它無法處理的字符串被添加到extras列表中。這是parse_known_args返回的第二個值。

+0

並非所有對包裝器有意義的參數都應該被刪除。所以我需要有選擇性 –

+0

如何才能知道要刪除的參數的虛擬解析器?你不必對它所分析的參數做任何事情,並且'sys.argv'沒有被分析用完或損壞。 – hpaulj

+0

我添加了一個關於argparse如何迭代參數字符串的註釋。 – hpaulj

1

我不熟悉parser.parse_known_args()。我正在使用Python 2.7,並沒有這樣的功能。什麼,你可以做雖然節省是在說arg_list原sys.argv中,做

指數= [arg_list.index(一)對在selected_arguments]

這將返回指數列表(的位置)的選定參數