2012-01-31 1 views
5

Vorrei usare argparse per analizzare gli argomenti che conosce e quindi lasciare il resto intatto. Per esempio io voglio essere in grado di eseguireLascia argomenti non trattati con argparse

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

che utilizza l'opzione -o e lascia il resto intatto.

Il profiler.py modulo fa una cosa simile con optparse, ma dal momento che sto usando argparse sto facendo:

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 

Che sembra anche funzionare, ma cosa succede se anche other_script.py anche ha una bandiera -o?

C'è in generale un modo migliore per risolvere questo problema?

risposta

5

argparse interromperà l'analisi dell'argomento fino a EOF o --. Se si desidera avere argomento senza beeing analizzato da argparse, è possibile scrivere ::

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

Ah non sapeva che, grazie! Senza un pennarello sarebbe davvero difficile per argparse capire cosa sta succedendo, immagino, non è un problema facile .. –

+0

Dovrebbe essere chiarito che è necessario usare il metodo 'parse_known_args()' (almeno su python3. 6) – krishonadish

12

Si potrebbe anche aggiungere un argomento posizionale per il parser con nargs=argparse.REMAINDER, per catturare lo script e le relative opzioni:

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

Esecuzione dello script minima sopra ...

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

anche 'parse_known_args' dovrebbe farlo. –

+0

Questo sembra lasciare anche '--' intatto. Perfezionare! – user1338062