web-dev-qa-db-fra.com

Comment puis-je traiter les arguments de ligne de commande en Python?

Quelle serait une expression facile pour traiter les arguments de ligne de commande si j'attends quelque chose comme 001 ou 999 (limitons les attentes à 001 ... 999 pour cette fois), et quelques autres arguments passés, et que je voudrais ignorer tout inattendu ?

Je comprends que si, par exemple, j'ai besoin de savoir si "debug" a été passé parmi les paramètres, ce sera quelque chose comme ça:

if 'debug' in argv[1:]:
  print 'Will be running in debug mode.'

Comment savoir si 009 ou 575 a été adopté?

Tous ces appels sont attendus:

python script.py
python script.py 011
python script.py 256 debug
python script.py 391 xls
python script.py 999 debug pdf

À ce stade, je me fiche des appels comme ça:

python script.py 001 002 245 568
python script.py some unexpected argument
python script.py 0001
python script.py 02

... premier - à cause de plus d'un argument "numérique"; deuxièmement - à cause de ... enfin, des arguments inattendus; troisième et quatrième - à cause d'arguments non à 3 chiffres.

26
user63503

Comme d'autres l'ont répondu, optparse est la meilleure option, mais si vous voulez juste un code rapide, essayez quelque chose comme ceci:

import sys, re

first_re = re.compile(r'^\d{3}$')

if len(sys.argv) > 1:

    if first_re.match(sys.argv[1]):
        print "Primary argument is : ", sys.argv[1]
    else:
        raise ValueError("First argument should be ...")

    args = sys.argv[2:]

else:

    args = ()

# ... anywhere in code ...

if 'debug' in args:
    print 'debug flag'

if 'xls' in args:
    print 'xls flag'

EDIT : Voici un exemple optparse parce que beaucoup de gens répondent à optparse sans vraiment expliquer pourquoi, ni expliquer ce que vous devez changer pour que cela fonctionne.

La principale raison d'utiliser optparse est qu'il vous donne plus de flexibilité pour une expansion ultérieure et vous donne plus de flexibilité sur la ligne de commande. En d'autres termes, vos options peuvent apparaître dans n'importe quel ordre et les messages d'utilisation sont générés automatiquement. Cependant, pour le faire fonctionner avec optparse, vous devez modifier vos spécifications pour mettre "-" ou "-" devant les arguments optionnels et vous devez autoriser tous les arguments à être dans n'importe quel ordre.

Voici donc un exemple utilisant optparse:

import sys, re, optparse

first_re = re.compile(r'^\d{3}$')

parser = optparse.OptionParser()
parser.set_defaults(debug=False,xls=False)
parser.add_option('--debug', action='store_true', dest='debug')
parser.add_option('--xls', action='store_true', dest='xls')
(options, args) = parser.parse_args()

if len(args) == 1:
    if first_re.match(args[0]):
        print "Primary argument is : ", args[0]
    else:
        raise ValueError("First argument should be ...")
Elif len(args) > 1:
    raise ValueError("Too many command line arguments")

if options.debug:
    print 'debug flag'

if options.xls:
    print 'xls flag'

Les différences ici avec optparse et vos spécifications sont que maintenant vous pouvez avoir des lignes de commande comme:

python script.py --debug --xls 001

et vous pouvez facilement ajouter de nouvelles options en appelant parser.add_option ()

31
Van Gale

Jetez un œil au module optparse . Traiter soi-même sys.argv est bien pour des choses vraiment simples, mais cela devient rapidement incontrôlable.

Notez que vous pouvez trouver optparse plus facile à utiliser si vous pouvez modifier un peu le format de votre argument; par exemple. remplacez debug par --debug et xls avec --xls ou --output=xls.

15
John Fouhy

optparse est votre meilleur ami pour analyser la ligne de commande. Regardez également argparse ; ce n'est pas dans la bibliothèque standard, cependant.

2
regan

Si vous souhaitez implémenter des commutateurs de ligne de commande réels, jetez un œil à getopt . C'est aussi incroyablement simple à utiliser.

2
sli

Van Gale a largement raison d'utiliser l'expression régulière contre l'argument. Cependant, il n'est PAS absolument nécessaire de faire de tout une option lorsque vous utilisez optparse, qui divise sys.argv en options et arguments, selon que "-" ou "-" est devant ou non. Quelques exemples de code pour parcourir uniquement les arguments:

import sys
import optparse

claParser = optparse.OptionParser()
claParser.add_option(
(opts, args) = claParser.parse_args()
if (len(args) >= 1):
  print "Arguments:"
  for arg in args:
    print "  " + arg
else:
  print "No arguments"
sys.exit(0)

Oui, le tableau args est analysé de la même manière que sys.argv, mais la possibilité d'ajouter facilement des options si nécessaire a été ajoutée. Pour en savoir plus sur optparse, consultez le pertinent Python doc .

0
PTBNL