Jul 03, 2024

Wiki

Python

Aide

edit SideBar

Search

Optparse


Présentation

Le module optparse est une alternative moderne pour analyser les options passées en lignes de commandes.

Il inclus plus d'options que Getopt : convertion de type, génération automatique de l'aide, etc.

  • Getopt ne faisait que parser (analyser) les options.
  • Optparse, lui, permet d'associer des actions aux options, par des arguments passés à la méthode add_option(). Ces actions comprennent :
    • l'enregistrement des arguments (séparément, ou dans une liste),
    • l'enregistrement d'une valeur (par ex. un booléen) quand une option est rencontrée,
    • le décompte du nombre de fois qu'une option est rencontrée, etc.

Utilisation

L'analyse des options avec optparse se fait en deux étapes : instantiation, puis ajout de chaque option...

Instantiation

Un objet OptionParser est instantié

  >>> import optparse
  >>> parser = optparse.OptionParser()

Ajout d'options

Une fois que l'objet OptionParser a été créé, chaque option est ajoutée, l'une après l'autre, en précisant ce qu'il faut faire quand ladite option est rencontrée :

  >>> import optparse
  >>> parser.add_option('-o', '--output', 
                  dest="output_filename", 
                  default="default.out",
                  )
  • Toute chaîne de caractère située au début de la liste d'arguments de la méthode add_option() est considérée comme un alias pour l'option. Ainsi, dans ce qui précède, -o et --output feront la même chose.
  • L'action de base est la sauvegarde de l'argument. Dans ce cas, si un type est spécifié, l'argument est convertit avant d'être enregistré.
  • Si l'argument 'dest' (destination) est passé à la méthode add_option(), la valeur de l'option est sauvegardée dans un attribut portant ce nom (pour l'objet OptionParser).

L'analyse

Une fois que toutes les options ont été définies, la ligne de commande est analysée en passant une suite d'arguments (chaîne de caractères) à parse_args().

Par défaut, les arguments sont pris dans sys.argv[1:], mais on peut aussi passer sa propre liste. (Les options sont analysés en utilisant la syntaxe GNU/POSIX, donc les options et les arguments peuvent être mélangés dans la suite passée en argument.)

La valeur de retour de parse_args() est un couple contenant :

  • une instance optparse.Values,
  • la liste des arguments qui n'ont pas été interprétés.

L'instance Values contient les valeurs de l'option comme attribut : ainsi, si la destination ('dest') de l'option est "monoption", on peut accéder à cette valeur par options.monoption.

Exemples

Exemple zéro

Dans ce qui suit, on se contente de tester si des options passées en argument sont présentes ou non...

  import optparse
  parser = optparse.OptionParser()

  parser.add_option('-a', '--all', action="store_true", default=False)
  parser.add_option('-c', '--clear', action="store_true", default=False)

  options, remainder =  parser.parse_args()

  if options.all == True:
      print "Présence de l'option all"
  else:
      print "Absence de l'option all"
  if options.clear == True
      ...

Cet exemple montre donc comment accéder aux valeurs des arguments...

Premier exemple

Un petit exemple avec trois différentes options : une booléenne (-a), une chaîne de caractères (-b), et un entier (-c).

  >>> import optparse
  >>> parser = optparse.OptionParser()
  >>> parser.add_option('-a', action="store_true", default=False)
  >>> parser.add_option('-b', action="store", dest="b")
  >>> parser.add_option('-c', action="store", dest="c", type="int")

Les options de la ligne de commande sont analysés comme avec getopt.gnu_getopt(). Ainsi, par exemple, il y a deux manières de passer des options d'un caractère : '-bval' et '-b val'...

  >>> print parser.parse_args(['-a', '-bval', '-c', '3'])
  (<Values at 0xe29b8: {'a': True, 'c': 3, 'b': 'val'}>, [])

A la différence de ce qui se passe avec le module getopt, les options longues sont traitées de la même manière que les options courtes :

  >>> parser = optparse.OptionParser()
  >>> parser.add_option('--noarg', action="store_true", default=False)
  >>> parser.add_option('--witharg', action="store", dest="witharg")
  >>> parser.add_option('--witharg2', action="store", dest="witharg2",\
                        type="int")

Et les résultats sont les mêmes :

  >>> print parser.parse_args([ '--noarg', '--witharg',^
                                'val', '--witharg2=3' ])
  (<Values at 0xd3ad0: {'noarg': True, 'witharg': 'val',
  'witharg2': 3}>, [])

Exemple (un peu) plus complet

  >>> import optparse
  >>> parser = optparse.OptionParser()
  >>> parser.add_option('-o', '--output', 
  ...                   dest="output_filename", 
  ...                   default="default.out",
  ...                   )

  >>> parser.add_option('-v', '--verbose',
  ...                   dest="verbose",
  ...                   default=False,
  ...                   action="store_true",
  ...                   )

  >>> parser.add_option('--version',
  ...                   dest="version",
  ...                   default=1.0,
  ...                   type="float",
  ...                   )

  options, remainder = parser.parse_args()

Des actions aux options

Présentation

Au lieu d'enregistrer les arguments directements, il est possible de définir des fonctions (callback) à invoquer lorsque l'option est rencontrée.

Il y a 4 arguments :

  • l'instance optparse.Option à l'origine de l'appel de la fonction,
  • la chaîne de caractères de l'option considérée,
  • l'argument associé à l'option,
  • l'instance optparse.OptionParser réalisant le travail d'analyse.

Exemple

Un exemple pour clarifier l'affaire :

  >>> import optparse
  >>> def flag_callback(option, opt_str, value, parser):
  ...     print 'flag_callback:'
  ...     print '\toption:', repr(option)
  ...     print '\topt_str:', opt_str
  ...     print '\tvalue:', value
  ...     print '\tparser:', parser
  ...     return
  >>> def with_callback(option, opt_str, value, parser):
  ...     print 'with_callback:'
  ...     print '\toption:', repr(option)
  ...     print '\topt_str:', opt_str
  ...     print '\tvalue:', value
  ...     print '\tparser:', parser
  ...     return
  >>> parser = optparse.OptionParser()
  >>> parser.add_option('--flag', action="callback",\
                        callback=flag_callback)
  >>> parser.add_option('--with', 
  ...                   action="callback",
  ...                   callback=with_callback,
  ...                   type="string",
  ...                   help="Include optional feature")

  >>> parser.parse_args(['--with', 'foo', '--flag'])
  with_callback:
        option: <Option at 0x78b98: --with>
        opt_str: --with
        value: foo
        parser: <optparse.OptionParser instance at 0x78b48>
  flag_callback:
        option: <Option at 0x7c620: --flag>
        opt_str: --flag
        value: None
        parser: <optparse.OptionParser instance at 0x78b48>

Plus d'un argument

Les fonctions (callbacks) associées aux options peuvent être configurées pour recevoir plusieurs arguments (utiliser nargs) :

  >>> def with_callback(option, opt_str, value, parser):
  ...     print 'with_callback:'
  ...     print '\toption:', repr(option)
  ...     print '\topt_str:', opt_str
  ...     print '\tvalue:', value
  ...     print '\tparser:', parser
  ...     return

  >>> parser = optparse.OptionParser()
  >>> parser.add_option('--with', 
  ...                   action="callback",
  ...                   callback=with_callback,
  ...                   type="string",
  ...                   nargs=2,
  ...                   help="Include optional feature")

  >>> parser.parse_args(['--with', 'foo', 'bar'])
  with_callback:
        option: <Option at 0x7c4e0: --with>
        opt_str: --with
        value: ('foo', 'bar')
        parser: <optparse.OptionParser instance at 0x78a08>

L'aide

OptionParser insère automatiquement une option d'aide à tout ensemble d'options, donc si l'utilisateur ajoute '--help' à la ligne de commande, il verra les instructions associées.

Le message d'aide inclus toutes les options, et permet de savoir si une telle option accepte un argument. On peut aussi ajouter du texte d'aide à la méthode add_option(), pour décrire l'option :

  >>> parser = optparse.OptionParser()
  >>> parser.add_option('--no-foo', action="store_true", 
  ...                   default=False, 
  ...                   dest="foo",
  ...                   help="Turn off foo",
  ...                   )

  >>> parser.add_option('--with', action="store",\
                        help="Include optional feature")
  >>> parser.parse_args()

Ce qui donnera :

  $ python optparse_help.py --help
  Usage: optparse_help.py [options]

  Options:
    -h, --help   show this help message and exit
    --no-foo     Turn off foo
    --with=WITH  Include optional feature

Page Actions

Recent Changes

Group & Page

Back Links