2012-01-31 140 views
5

我想使用argparse來解析它所知道的參數,然後保持其餘不變。例如,我希望能夠運行使用argparse保留參數

performance -o output other_script.py -a opt1 -b opt2 

它使用-o選項,並留下其餘不變。

模塊profiler.py確實有optparse了類似的事情,但因爲我使用argparse我做:

def parse_arguments(): 
    parser = new_argument_parser('show the performance of the given run script') 
    parser.add_argument('-o', '--output', default='profiled.prof') 

    return parser.parse_known_args() 

def main(): 
    progname = sys.argv[1] 
    ns, other_args = parse_arguments() 
    sys.argv[:] = other_args 

這也似乎工作,但如果還other_script.py還發生了什麼有一個-o的標誌?

有沒有一般更好的方法來解決這個問題?

回答

5

​​將停止解析參數,直到EOF或--。如果你想有沒有通過argparse beeing解析參數,你可以寫::

python [PYTHONOPTS] yourfile.py [YOURFILEOPT] -- [ANYTHINGELSE] 
+0

啊,不知道那個謝謝!如果沒有標記,實際上很難理解我猜想的是什麼,這不是一個簡單的問題。 – 2012-01-31 18:00:18

+0

應該明確的是,您需要使用'parse_known_args()'方法(至少在python3上)。 6) – krishonadish 2018-02-07 23:12:13

12

你也可以添加一個位置參數解析器與nargs=argparse.REMAINDER,捕捉腳本及其選項:

# In script 'performance'... 
p = argparse.ArgumentParser() 
p.add_argument("-o") 
p.add_argument("command", nargs=argparse.REMAINDER) 
args = p.parse_args() 
print args 

運行上面的最小腳本...

$ performance -o output other_script.py -a opt1 -b opt2 
Namespace(command=['performance', '-a', 'opt1', '-b', 'opt2'], o='output') 
+1

也'parse_known_args'應該這樣做。 – 2015-01-08 07:01:08

+0

這似乎使「 - 」完好無損。完善! – user1338062 2016-03-05 10:59:29