2012-01-16 10 views
9

Desidero utilizzare il modulo python argparse per analizzare la stringa del parametro cli. Questo funziona per i parametri di un passaggio dal terminale, ma non con una determinata stringa.Come si può usare argparse di python con una stringa di argomenti predefinita?

import argparse 

parser = argparse.ArgumentParser(description='Argparse Test script') 
parser.add_argument("param", help='some parameter') 

argString = 'someTestFile' 
print(argString) 

args = parser.parse_args(argString) 

Se corro questo script ottengo questo output:

~/someTestFile 
usage: argparsetest.py [-h] param 
argparsetest.py: error: unrecognized arguments: o m e T e s t F i l e 

Il ~/someTestFile è in qualche modo trasformato in o m e T e s t F i l e. Come già accennato, funziona se passo il nome del file dal terminale.

Immagino che questo abbia a che fare con le codifiche di stringhe. Qualcuno ha un'idea su come risolvere questo problema?

+0

potresti voler dare un'occhiata alla [documentazione di argparse] (http://docs.python.org/library/argparse.html#parsing-arguments). –

risposta

19

Ah, no no no. parser.parse_args() prevede una sequenza nella stessa forma di sys.argv[1:]. Se tratti una stringa come una sequenza sys.argv, ottieni ['s', 'o', 'm', 'e', 'T', 'e', 's', 't', 'F', 'i', 'l', 'e']. 's' diventa l'argomento pertinente, e quindi il resto della stringa è inaccessibile.

Invece, probabilmente si vuole passare parser.parse_args(['someTestFile'])

+0

Grazie! E 'stato ...! – thorink

4

Proprio come il default sys.argv è una lista, i tuoi argomenti devono essere una lista pure.

args = parser.parse_args([argString]) 
16

Un'altra opzione è utilizzare shlex.split. E 'particolarmente molto conveniente se si dispone di vero e proprio CLI argomenti stringa:

import shlex 
argString = '-vvvv -c "yes" --foo bar --some_flag' 
args = parser.parse_args(shlex.split(argString)) 
+1

Grazie! Questo è molto utile. Ora posso eseguire da riga di comando e da altri script Python! – Sudhi

+0

Qualcuno per favore dai a quest'uomo un biscotto –

0

Semplicemente split la stringa di comando:

args = parser.parse_args(argString.split()) 

Un esempio completo per mettere in mostra:

import argparse 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser() 
    parser.add_argument('--dummy_opt', nargs='*', type=int, help='some ids') 
    argString = "--dummy_opt 128 128" 
    args = parser.parse_args(argString.split()) 

    print(args) 

uscita volontà:

Namespace(pic_resize=[128, 128])

Problemi correlati