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.
L'analyse des options avec optparse se fait en deux étapes : instantiation, puis ajout de chaque option...
Un objet OptionParser est instantié
>>> import optparse >>> parser = optparse.OptionParser()
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", )
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 :
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.
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...
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}>, [])
>>> 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()
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 :
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>
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>
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