Tilpasset kommandolinjen parsing i Python

stemmer
7

Jeg skriver et skall for et prosjekt av meg, som ved design analyserer kommandoer som ser slik ut:

Command_name ARG1 = Long verdi ARG2 = 123 ARG3=me@me.com

Mitt problem er at Python er kommandolinje parsing bibliotek (getopt og optparse) tvinger meg til å bruke '-' eller '-' foran argumentene. Denne atferden samsvarer ikke med mine krav.

Noen ideer hvordan kan dette løses? Noen eksisterende bibliotek for dette?

Publisert på 01/10/2008 klokken 09:35
kilden bruker
På andre språk...                            


7 svar

stemmer
0

Uten ganske intensiv kirurgi på optparse eller getopt, jeg tror ikke du kan fornuftig gjøre dem analysere ditt format. Du kan enkelt analysere ditt eget format, selv om, eller oversette den til noe optparse kunne håndtere:

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)
Svarte 01/10/2008 kl. 09:50
kilden bruker

stemmer
10

Du kan dele dem opp med shlex.split (), som kan håndtere de oppgitte verdiene du har, og ganske lett å analysere denne med en veldig enkel vanlig uttrykk. Eller du kan bare bruke vanlige uttrykk for både splitting og analyse. Eller bare bruke split ().

args = {}
for arg in shlex.split(cmdln_args):
    key, value = arg.split('=', 1)
    args[key] = value
Svarte 01/10/2008 kl. 10:09
kilden bruker

stemmer
2

En liten Pytonske variant av Ironforggy sin shlex svar:

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

oops ... - korrigert.

takk, JF Sebastian (må huske disse enkle argument generator uttrykk).

Svarte 01/10/2008 kl. 10:48
kilden bruker

stemmer
9
  1. Prøv å følge " Standarder for kommandolinje-grensesnitt "

  2. Konverter dine argumenter (som Thomas foreslo) til OptionParser format.

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

Hvis kommandolinje argumenter ikke er i sys.argv eller en lignende liste, men i en streng deretter (som antydet ironfroggy) bruk shlex.split().

parser.parse_args(["--"+p if "=" in p else p for p in shlex.split(argsline)])
Svarte 01/10/2008 kl. 10:57
kilden bruker

stemmer
1

Hva om optmatch ( http://www.coderazzi.net/python/optmatch/index.htm )? Er ikke standard, men tar en annen tilnærming til alternativer parsing, og den støtter noen prefiks:

OptionMatcher.setMode (optionPrefix = '-')

Svarte 19/11/2009 kl. 00:30
kilden bruker

stemmer
0

Litt sent til festen ... men PEP 389 åpner for dette og mye mer.

Her er en liten hyggelig bibliotek bør din versjon av Python trenger det code.google.com/p/argparse

Nyt.

Svarte 16/04/2010 kl. 14:18
kilden bruker

stemmer
0

Du kan være interessert i en liten Python-modul jeg skrev å gjøre håndteringen av kommandolinjeargumentene enda enklere (åpen kildekode og gratis å bruke) - http://freshmeat.net/projects/commando

Svarte 06/02/2011 kl. 14:17
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more