2012-01-16 12 views
9

Chcę użyć modułu pythons argparse do przeanalizowania mojego parametru parametru cli. Działa to dla parametrów przejścia z terminala, ale nie dla danego ciągu.Jak korzystać z argparse Pythona z predefiniowanym ciągiem argumentów?

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) 

Jeśli uruchomić ten skrypt uzyskać ten wynik:

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

~/someTestFile jest w jakiś sposób przekształcony w o m e T e s t F i l e. Jak już wspomniano, działa, jeśli przekazuję nazwę pliku z terminala.

Mogę sobie wyobrazić, że ma to coś wspólnego z kodowaniem ciągów znaków. Czy ktoś ma pomysł, jak to naprawić?

+0

możesz zajrzeć do [dokumentacji argparse] (http://docs.python.org/library/argparse.html#parsing-arguments). –

Odpowiedz

19

Ah, nie, nie, nie. parser.parse_args() oczekuje sekwencji w tej samej postaci co sys.argv[1:]. Jeśli potraktujesz ciąg znaków jak sekwencję sys.argv, otrzymasz ['s', 'o', 'm', 'e', 'T', 'e', 's', 't', 'F', 'i', 'l', 'e']. "s" staje się istotnym argumentem, a reszta łańcucha jest nie do zniesienia.

Zamiast tego prawdopodobnie chcesz przejść w parser.parse_args(['someTestFile'])

+0

Dzięki! To było to…! – thorink

4

Podobnie jak domyślnie sys.argv jest lista, twoje argumenty mają być listy, jak również.

16

Inną opcją jest użycie shlex.split. Jest to przede wszystkim bardzo wygodne, jeśli masz prawdziwą CLI argumenty ciąg:

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

Dzięki! Jest to bardzo przydatne. Teraz mogę uruchomić zarówno z wiersza poleceń, jak iz innych skryptów Pythona! – Sudhi

+0

Ktoś proszę dać temu człowiekowi ciasteczko –

0

Wystarczy split ciąg poleceń:

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

Kompletny przykład do zaprezentowania:

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) 

wyjście wola:

Namespace(pic_resize=[128, 128])

Powiązane problemy