Question

Quelle serait une expression facile à traiter les arguments de ligne de commande si je me attends quelque chose comme 001 ou 999 (laisser les attentes limites à 001 ... 999. pour cette fois-ci), et quelques autres arguments passés, et que vous souhaitez ignorer inattendu?

Je comprends par exemple si je dois savoir si « debug » a été passé entre 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 ne me soucie pas 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 - en raison de plus d'un argument « numérique »; deuxième - à cause de ... bien, des arguments inattendus; troisième et quatrième -. en raison d'arguments non-3-chiffres

Était-ce utile?

La solution

Comme d'autres ont répondu, optparse est la meilleure option, mais si vous voulez juste code rapide essayer 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, ou d'expliquer ce que vous devez changer pour le faire fonctionner

La principale raison d'utiliser optparse est-ce que vous donne plus de flexibilité pour l'expansion ultérieure, et vous donne plus de flexibilité sur la ligne de commande. En d'autres termes, vos options peuvent apparaître dans tous les messages de commande et d'utilisation sont générés automatiquement. Cependant, pour le faire fonctionner avec optparse vous devez changer vos spécifications pour mettre « - » ou « - ». Devant les arguments optionnels et vous avez besoin pour permettre à tous les arguments pour être dans un ordre

Alors, voici un exemple d'utilisation 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 votre spec est que vous pouvez maintenant 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 ()

Autres conseils

Jetez un oeil à la optparse module. Faire face à vous-même sys.argv est très bien pour des trucs vraiment simple, mais il sort de la main rapidement.

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

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

Si vous souhaitez implémenter les commutateurs de ligne de commande réelle, donner getopt un regard. Il est incroyablement simple à utiliser, aussi.

Van Gale est en grande partie correcte en utilisant l'expression régulière contre l'argument. Cependant, il est pas absolument nécessaire de tout faire une option lors de l'utilisation optparse, qui divise sys.argv en options et des arguments, sur la base de savoir si un « - » ou « - » est en face ou non. Certains exemples de code pour passer par quelques 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 serait, mais la possibilité d'ajouter facilement des options si nécessaire a été ajouté. Pour en savoir plus sur les optparse, consultez le Python doc correspondant.

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