2008-10-01 9 views
7

Piszę powłoki na projekt kopalni, która według projektu przetwarza polecenia, które wygląda następująco:Dostosowane analizowania wiersza polecenia w Pythonie

command_name ARG1 = „Długie Value” ARG2 = 123 = mnie Arg3 @ mnie .com

Moim problemem jest to, że biblioteki parsujące w Pythonie (getopt i optparse) zmuszają mnie do używania "-" lub "-" przed argumentami. To zachowanie nie pasuje do moich wymagań.

Jakieś pomysły, jak można to rozwiązać? Każda istniejąca biblioteka do tego?

+0

To białe miejsca w „długi Value” może dać dodatkowe kłopoty . Nie jestem pewien, czy optparse (lub inne biblioteki) poradzi sobie z tym. – Ralph

+1

@Ralph: Optparse obsługuje "Long Value". – jfs

Odpowiedz

10

Można by podzielić je z shlex.split(), która może obsługiwać Podane wartości masz, i dość łatwo przeanalizuj to za pomocą prostego wyrażenia regularnego. Możesz też użyć wyrażeń regularnych zarówno do dzielenia, jak i do analizowania. Lub po prostu użyj polecenia split().

args = {} 
for arg in shlex.split(cmdln_args): 
    key, value = arg.split('=', 1) 
    args[key] = value 
+0

W pytonie 2.5 i wyżej możesz również: klucz, _, wartość = arg.partycja ('=') – tzot

+2

args = dict (arg.split ('=', 1) dla arg w shlex.split (cmdln_args)) – jfs

0

Bez dość intensywnej operacji na optparse lub getopt, nie wierzę, że można rozsądnie zmusić ich do przeanalizowania formatu. Można łatwo analizować swój własny format, chociaż, albo przełożyć je na coś optparse mógł obsługiwać:

parser = optparse.OptionParser() 
parser.add_option("--ARG1", dest="arg1", help="....") 
parser.add_option(...) 
... 
newargs = sys.argv[:1] 
for idx, arg in enumerate(sys.argv[1:]) 
    parts = arg.split('=', 1) 
    if len(parts) < 2: 
     # End of options, don't translate the rest. 
     newargs.extend(sys.argv[idx+1:]) 
     break 
    argname, argvalue = parts 
    newargs.extend(["--%s" % argname, argvalue]) 

parser.parse_args(newargs) 
2

Mała pythonic wariacja na shlex odpowiedź Ironforggy za:

args = dict(arg.split('=', 1) for arg in shlex.split(cmdln_args)) 

Ups ... - poprawił.

dziękuję, J.F. Sebastian (musimy zapamiętać te wyrazy generatora pojedynczego argumentu).

9
  1. próbować podążać "Standards for Command Line Interfaces"

  2. Konwersja argumentów (jak sugeruje Thomas) do formatu OptionParser.

    parser.parse_args(["--"+p if "=" in p else p for p in sys.argv[1:]]) 
    

Jeśli argumenty wiersza polecenia nie są w sys.argv lub podobnej liście, ale w ciąg wówczas (jak ironfroggy sugerowane) używać shlex.split().

parser.parse_args(["--"+p if "=" in p else p for p in shlex.split(argsline)]) 
1

Co z opcją optmatch (http://www.coderazzi.net/python/optmatch/index.htm)? nie jest standardowa, ale ma inne podejście do opcji analizowania i obsługuje dowolny prefiks:

OptionMatcher.setMode (optionPrefix = „-”)

+0

@rafalotufo, myślę, że twoja proponowana edycja tego pytania powinna być komentarzem - wskazanie, że proponowane rozwiązanie nie zadziała, bardzo drastycznie zmienia znaczenie odpowiedzi. :) – sarnold

0

trochę późno na imprezę ... ale PEP 389 pozwala na to i wiele więcej.

Oto mały ładny biblioteka powinna wersja Pythona trzeba to code.google.com/p/argparse

Enjoy.

Powiązane problemy