Frage

Kann mir jemand vor Ort, warum das folgende Skript wird die übergebenen Argumente nicht gedruckt wird?

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:])

Als ich das Skript auf der Kommandozeile ausführen und die Argumente -f=dummy.csv passieren, scheint usage() stattdessen aufgerufen werden - WARUM

BTW, ich die Logik des Programms finden fließen ein wenig seltsam (I kopiert es von hier ). Normalerweise hätte ich gedacht, dass die Logik in dem Versuch Zweig umgesetzt werden, und dann danach kommt die Exception-Handler.

Ist dies (wie im Code eingefügt oben) der 'Pythonic' Art und Weise zu schreiben try / catch-Blöcke?

War es hilfreich?

Lösung

  

Normalerweise würde ich gedacht, dass die Logik im try Zweig implementiert wird

"Normalerweise"? Was bedeutet normalerweise bedeuten?

Was ist das Programm tun soll? Welche Ausnahmen machen Sinn? Was macht das Programm als Reaktion auf die Ausnahmen.

Es gibt keine „normal“. Sowenig wie es eine normale Zuweisungsanweisung oder eine normale Funktionsdefinition.

Ihr Programm tut, was Sinn macht, den erforderlichen End-Zustand zu erreichen. Es gibt keine "normal".

Andere Tipps

Hast du deine Antworten?

Eine Möglichkeit zum Debuggen von Python Ausnahmen zu verschieben (oder kopiert vorübergehend für das Debuggen), um den Code aus dem try-Block. Sie erhalten eine vollständige Spur bekommen.

Und natürlich ist ein weiterer Weg, um den Testfall zu reduzieren. Hier habe ich die Probleme auf drei Linien reduziert, und die Lösung versucht, angedeutet durch @ S. Lott (mit ‚f:‘ in den getopts nennen), und zeige auch, am Ende, wie mit einigen verschiedenen Testdaten verhalten Aufruf:

$ 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']

Import und Verwendung argparse statt getopt. Es ist viel einfacher zu bedienen und hat fast alles was Sie brauchen in der Befehlszeile für die Ausführung, eingebaut in es.

Ein Beispiel:

    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()

So einfach ist das. Sie müssen Import argparse am Anfang der Datei für diese Arbeit, natürlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top