2009-11-19 4 views
0

Merci pour le charlatan en soulignant le hors-par-un!Pour comprendre l'optparse de Python

Le code suivant est ma première tentative d'écriture de code avec Optparse.

Comment pouvez-vous résoudre le problème suivant en obtenant l'aide d'Optparse?

#!/usr/bin/env python 
import sys 
import os 
from optparse import OptionParser 


e = sys.argv[1] 
b = sys.argv[2] 
no = sys.argv[3] 

def set_figu(figu): 
     sum = 777 
     return sum 


def main(): 
     usage = "Usage: negative_bin_base.py <eksponentti> <siirre> <figu>" 
     parser = OptionParser(usage) 
     parser.add_option("-h", "--help", dest="help", 
         help="get synopsis of parameters") 
     # print the output of the work-horse 
     print set_figu(no) 

     (options, args) = parser.parse_args() 
     if len(args) < 4: 
       parser.error("incorrect number of arguments") 
     if options.informative: 
       print "reading %s..." % options.help 

if __name__ == "__main__": 
     main() 

Exemple de sortie mal avec nombre correct de paramètres

python negative_bin_base.py 13 13 332 
Traceback (most recent call last): 
    File "negative_bin_base.py", line 37, in <module> 
    main() 
    File "negative_bin_base.py", line 26, in main 
    help="get synopsis of parameters") 
    File "/usr/lib/python2.6/optparse.py", line 1020, in add_option 
    self._check_conflict(option) 
    File "/usr/lib/python2.6/optparse.py", line 995, in _check_conflict 
    option) 
optparse.OptionConflictError: option -h/--help: conflicting option string(s): -h, --help 
+1

Regardez le module optparse, ce qui facilite considérablement le processus s: http://docs.python.org/library/optparse.html –

+1

Pour un cas unique de traitement des args comme vous l'êtes est bien, mais investir le temps d'apprendre optparse en vaudra la peine à long terme. –

Répondre

8

Constructeur pour class optparse.OptionParser(...) a paramètre optionnel nommé « add_help_option », qui est par défaut « Vrai ». Vous devrez explicitement rejeter l'option et le message d'aide par défaut, si vous souhaitez fournir les vôtres.

parser = OptionParser(usage, add_help_option=False)

+0

si vous trouvez trop 'optparse' pour ce dont vous avez besoin, vous pouvez aussi regarder dans 'getopt' http://docs.python.org/library/getopt.html – artdanil

+0

Je venais juste de poster une réponse similaire. Merci pour cela. – jathanism

6

Le bug est que votre tableau d'arguments comprend le nom du script sys.argv[0]. Ainsi votre if est hors par un:

# python sys.argv[0] sys.argv[1] sys.argv[2] sys.argv[3] 
if len(sys.argv) < 4: 
     sys.exit(usage) 
1

Cela devrait faire ce que vous avez besoin, en fonction de votre exemple ci-dessus:

#!/usr/bin/env python 
from optparse import OptionParser 

def main(): 
    usage = "Usage: negative_bin_base.py <eksponentti> <siirre> <figu>" 
    parser = OptionParser(usage) 
    (options, args) = parser.parse_args() 
    if len(args) != 3: 
     parser.error("incorrect number of arguments") 
    e = args[0] 
    b = args[1] 
    no = args[2] 
    # ... 

if __name__ == "__main__": 
    main() 
1

Pour utiliser optparse voici ce que je fais normalement:

  1. analyse syntaxique de la ligne de commande séparée de votre base de code principale pour une meilleure modularisation. (Mettez le traitement juste après "if __name__ ==" __main__ "")

  2. Laissez opter pour votre aide. (Utilisez parser.print_help())

  3. Utilisez les constructions optparse, si vous ne les aimez pas, analysez vous-même sys.argv. (utilisation add_option pour définir vos options nécessaires)

Voilà comment j'écrire votre échantillon en utilisant la bibliothèque optparse:

def main(): 
    print 'Welcome to the main event!' 


if __name__ == '__main__': 
    import optparse 
    parser = optparse.OptionParser() 
    parser.add_option("-e", "--eksponentti", dest="eksponentti", 
         help="This is help for <eksponentti>.", 
         default=None) 
    parser.add_option("-s", "--siirre", dest="siirre", 
         help="This is help for <siirre>.", 
         default=None) 
    parser.add_option("-f", "--figu", dest="figu", 
         help="This is help for <figu>.", 
         default=None) 

    (options, args) = parser.parse_args() 
    if options.eksponentti and options.siirre and options.figu: 
     main() 
    else: 
     print "ERROR -- Expected Arguments not given!" 
     parser.print_help() 

L'exécution de ce sans les options nécessaires donnera la sortie suivante: (C'est un peu plus joli que je ne peux le formater ici ...)

ERROR -- Expected Arguments not given! Usage: parm.py [options] 

Options: 
    -h, --help   show this help message and exit 
    -e EKSPONENTTI, --eksponentti=EKSPONENTTI This is help for <eksponentti>. 
    -s SIIRRE, --siirre=SIIRRE This is help for <siirre>. 
    -f FIGU, --figu=FIGU This is help for <figu>. 
+0

Comment lisez-vous cette ligne 'if options.eksponentti et options.siirre et options.figu:'? J'utilise 3 paramètres dans ma commande et la clause if n'est pas vraie. –

+0

monkut a changé la façon dont vos options de ligne de commande sont gérées, il a nommé les options pour vous.Par exemple, 'python negative_bin_base.py -e 13 -s 13 -f 332'. –

+0

Merci, John. Oui, les options.

Questions connexes