Question

J'écris un shell pour un de mes projets qui, par sa conception, analyse les commandes qui ressemblent à ceci:

COMMAND_NAME ARG1 = " Valeur longue " ARG2 = 123 ARG3=me@me.com

Mon problème est que les bibliothèques d'analyse de ligne de commande (getopt et optparse) de Python m'obligent à utiliser '-' ou '-' devant les arguments. Ce comportement ne correspond pas à mes exigences.

Des idées pour résoudre ce problème? Une bibliothèque existante pour cela?

Était-ce utile?

La solution

Vous pouvez les séparer avec shlex.split (), qui peut gérer les valeurs que vous avez citées et l’analyser assez facilement avec une expression régulière très simple. Ou, vous pouvez simplement utiliser des expressions régulières pour le fractionnement et l'analyse. Ou utilisez simplement split ().

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

Autres conseils

  1. Essayez de suivre & Standards pour les interfaces de ligne de commande "

  2. Convertissez vos arguments (comme suggéré par Thomas) au format OptionParser.

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

Si les arguments de ligne de commande ne figurent pas dans sys.argv ou une liste similaire, mais dans une chaîne, utilisez (comme suggéré par Ironfroggy) shlex.split () .

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

Une petite variation pythonique de la réponse shlex d’Ironforggy:

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

oops ... - corrigé.

merci, J.F. Sebastian  (je dois me souvenir de ces expressions génératrices d’argument unique).

Qu'en est-il de optmatch ( http://www.coderazzi.net/python/optmatch /index.htm )? N'est pas standard, mais adopte une approche différente pour l'analyse des options et prend en charge tous les préfixes:

OptionMatcher.setMode (optionPrefix = '-')

Sans une chirurgie assez intensive sous optparse ou getopt, je ne pense pas que vous puissiez leur faire analyser votre format de manière raisonnable. Cependant, vous pouvez facilement analyser votre propre format ou le traduire en quelque chose que Optparse pourrait gérer:

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)

Un peu tard dans la soirée ... mais PEP 389 permet pour cela et bien plus encore.

Voici une petite bibliothèque intéressante si votre version de Python en avait besoin: code.google.com/p/argparse

Profitez.

Vous pourriez être intéressé par un petit module Python que j'ai écrit pour faciliter la gestion des arguments en ligne de commande (source ouverte et libre d'utilisation) - http://freshmeat.net/projects/commando

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top