L'analyse syntaxique des arguments de ligne de commande dans un script python (maux de Getopt)

StackOverflow https://stackoverflow.com/questions/3934799

  •  30-09-2019
  •  | 
  •  

Question

spot Quelqu'un peut-il pourquoi le script suivant n'imprime pas les arguments passés?

import sys, getopt

def usage():
    print 'Unknown arguments'

def main(argv):
    try:
        opts, args = getopt.getopt(argv,'fdmse:d',['files=','data-source=','mode=','start','end'])

    except getopt.GetoptError:
        usage()
        sys.exit(999)

    for opt, arg in opts:
        # print opt,arg 
        if opt in('-f','--files'):
            print 'files: ', arg  #

if __name__ == "__main__":
    main(sys.argv[1:])

Quand je lance le script à la ligne de commande et passer les arguments -f=dummy.csv, usage() semble être invoqué à la place - POURQUOI

BTW, je trouve la logique du flux programme un peu bizarre (je l'ai copié de ici ). Normalement, je l'aurais pensé que la logique sera mise en œuvre dans la branche essayer, et puis après vient le gestionnaire d'exception.

Est-ce (comme dans le code collé ci-dessus) le chemin 'Pythonic' pour essayer d'écriture / blocs catch?

Était-ce utile?

La solution

  

Normalement, j'aurais pensé que la logique sera mise en œuvre dans la branche try

"Normalement"? Qu'est-ce que signifie normalement?

Quel est le programme censé faire? Quelles exceptions sens? Qu'est-ce que le programme ne en réponse aux exceptions.

Il n'y a pas « normalement ». Pas plus que il y a une instruction d'affectation normale ou une définition de fonction normale.

Votre programme fait ce qui fait sens pour atteindre l'état final requis. Il n'y a pas "normalement".

Autres conseils

Avez-vous obtenu vos réponses?

Une façon d'exceptions python de débogage est de déplacer (ou copier temporairement pour le débogage) le code hors du bloc d'essai. Vous aurez une trace complète.

Et bien sûr, une autre façon est de réduire le cas de test. Ici, j'ai réduit les problèmes à trois lignes, et a essayé la solution laissé entrevoir par @ S. Lott (en utilisant « f: » dans les getopts appellent), et montre aussi à la fin comment appeler avec des données de se comporte différents tests:

$ cat x1.py
import sys, getopt
opts, args = getopt.getopt(sys.argv[1:],'fdmse:d',['files=','data-source=','mode=','start','end'])
print "opts=", opts, "args=", args

$ python x1.py -f=dummy.csv argblah
Traceback (most recent call last):
  File "x1.py", line 2, in <module>
    opts, args = getopt.getopt(sys.argv[1:],'fdmse:d',['files=','data-source=','mode=','start','end'])
  File "/usr/lib/python2.6/getopt.py", line 91, in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
  File "/usr/lib/python2.6/getopt.py", line 191, in do_shorts
    if short_has_arg(opt, shortopts):
  File "/usr/lib/python2.6/getopt.py", line 207, in short_has_arg
    raise GetoptError('option -%s not recognized' % opt, opt)
getopt.GetoptError: option -= not recognized

$ sed 's/fdm/f:dm/' <x1.py >x2.py

$ diff x1.py x2.py
2c2
< opts, args = getopt.getopt(sys.argv[1:],'fdmse:d',['files=','data-source=','mode=','start','end'])
---
> opts, args = getopt.getopt(sys.argv[1:],'f:dmse:d',['files=','data-source=','mode=','start','end'])

$ python x2.py -f=dummy.csv argblah
opts= [('-f', '=dummy.csv')] args= ['argblah']

$ python x1.py -f dummy.csv argblah
opts= [('-f', '')] args= ['dummy.csv', 'argblah']

Importation et utilisation argparse au lieu de getopt. Il est beaucoup plus facile à utiliser et a presque tout ce que vous avez besoin pour courir à partir de la ligne de commande, construit en elle.

Un exemple,

    parser = argparse.ArgumentParser(
        description='Description of what the module does when run.')
    parser.add_argument("-o", "--output", help='Path of log file.')
    args = parser.parse_args()

aussi simple que cela. Vous devez argparse d'importation en haut de votre dossier pour que cela fonctionne, bien sûr.

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