Seite 1 von 1

OptionParser problem

Verfasst: Freitag 4. Dezember 2009, 15:32
von mit
Hi.
Ich verwende OptionParser und wenn der User keine Parameter übergibt dann soll eine Anleitung angezeigt werden:

Code: Alles auswählen

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

if __name__ == '__main__':
    parser = OptionParser("Usage: %prog -f FileName [Option]")

    parser.add_option("-f", "--file", type="string", dest="FileName",
        help="File name.")

    (opts, args) = parser.parse_args()

    print len(args)
    
    if len(args) > 0:
        parser.print_help()
        sys.exit(1)
Wenn ich python xxxx.py -f hallo.txt verwende ist die variable args weiterhin 0 und nicht 1. Wie kann ich dies beheben?

Viele Grüße

Verfasst: Freitag 4. Dezember 2009, 16:06
von EyDu

Re: OptionParser problem

Verfasst: Freitag 4. Dezember 2009, 16:12
von CM
mit hat geschrieben:Ich verwende OptionParser und wenn der User keine Parameter übergibt dann soll eine Anleitung angezeigt werden:
Das ist ziemlich unüblich: Wenn es keine Parameter gibt, sollte das Programm einfach laufen. Mit -h oder --help wird dann der usage-String angezeigt und eine Zusammenfassung der Optionen angezeigt -- siehe Link von EyDu.

Re: OptionParser problem

Verfasst: Freitag 4. Dezember 2009, 16:56
von Hyperion
CM hat geschrieben:
mit hat geschrieben:Ich verwende OptionParser und wenn der User keine Parameter übergibt dann soll eine Anleitung angezeigt werden:
Das ist ziemlich unüblich: Wenn es keine Parameter gibt, sollte das Programm einfach laufen. Mit -h oder --help wird dann der usage-String angezeigt und eine Zusammenfassung der Optionen angezeigt -- siehe Link von EyDu.
Nuja, wenn das Programm ohne Parameter nichts tun kann, dann ist es schon üblich zumindest eine Ausgabe zu geben, in der auf die Hilfeseite mit dem Schalter -h / --help hingewiesen wird.

Aber das kann man ja leicht prüfen und entsprechend verzweigen. (len() von opts und args)

@mit: EyDu hat Dir ja schon den Wink mit dem Zaunpfhal gegeben. Ich schlage noch mal folgendes vor:

Code: Alles auswählen

print "opts", opts
print "args", args
Das hätte diesen Thread mit einiger sicherheit obsolet gemacht :-D

Verfasst: Freitag 4. Dezember 2009, 17:03
von CM
Lots of people want their programs to have “required options”. Think about it. If it’s required, then it’s not optional! If there is a piece of information that your program absolutely requires in order to run successfully, that’s what positional arguments are for.
Deswegen schrieb ich "unüblich". Klar hält einen niemand davon ab, doch sind IMHO "arguments" bzw. "positional arguments" einer "required option" vorzuziehen. Programme / Skripte, die ein halbes Jahr später noch intuitiv zu benutzen sind, geben gute defaults und zeigen eine Hilfe an, wenn benötigte Argumente (nicht Optionen) fehlen. Wenn über optparse die Hilfe ausgegeben wird, wird automatisch auf -h/--help hingewiesen.

Just my $.02 .

Verfasst: Freitag 4. Dezember 2009, 17:30
von Hyperion
CM hat geschrieben:
Lots of people want their programs to have “required options”. Think about it. If it’s required, then it’s not optional! If there is a piece of information that your program absolutely requires in order to run successfully, that’s what positional arguments are for.
Deswegen schrieb ich "unüblich". Klar hält einen niemand davon ab, doch sind IMHO "arguments" bzw. "positional arguments" einer "required option" vorzuziehen. Programme / Skripte, die ein halbes Jahr später noch intuitiv zu benutzen sind, geben gute defaults und zeigen eine Hilfe an, wenn benötigte Argumente (nicht Optionen) fehlen.
Hm.. da muss ich mich noch mal schlau lesen bezüglich der Terminologie. Ich vermute mal wir denken da schon an das gleiche.
Wenn über optparse die Hilfe ausgegeben wird, wird automatisch auf -h/--help hingewiesen.
Sicher. Aber das ist ja kein Mehrwert an der Stelle. Wenn ich die Hilfe aufgerufen habe, dann kenne ich den Parameter "-h" ja schon ;-)

Sinnvoll ist es darauf hinzuweisen, wenn ich eben etwas angeben muss! Dann will ich ja nicht gleich die gesamte Hilfe lesen, sondern speziell darauf hingewiesen werden, dass "etwas" fehlt und dass ich mir doch mal die Hilfe angucken sollte, die man wiederum so und so erreichen kann.

Mal meine 4 Pfennig :-)

Verfasst: Samstag 5. Dezember 2009, 01:14
von mit
Sinnvoll ist es darauf hinzuweisen, wenn ich eben etwas angeben muss! Dann will ich ja nicht gleich die gesamte Hilfe lesen, sondern speziell darauf hingewiesen werden, dass "etwas" fehlt und dass ich mir doch mal die Hilfe angucken sollte, die man wiederum so und so erreichen kann.
Das würde mir auch gefallen, aber wie kann ich den oberen vorschlag implementieren, denn len(opts) und len(args) funtioniert nicht?

Verfasst: Samstag 5. Dezember 2009, 01:19
von Hyperion
mit hat geschrieben: Das würde mir auch gefallen, aber wie kann ich den oberen vorschlag implementieren, denn len(opts) und len(args) funtioniert nicht?
Ist das eine Frage? Wenn ja, probiere es doch aus! Wenn nein, wie äußert sich denn "funktioniert" nicht?

Verfasst: Samstag 5. Dezember 2009, 12:17
von mit
Wenn ich es ausprobiere bekomme ich diese Fehlermeldung:

Code: Alles auswählen

$ python2.5 test1.py -f sdlfjs
opts {'FileName': 'sdlfjs'}
Traceback (most recent call last):
  File "test1.py", line 13, in <module>
    print "opts", opts, len(opts)
AttributeError: Values instance has no attribute '__len__'

Code: Alles auswählen

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

if __name__ == '__main__':
    parser = OptionParser("Usage: %prog -f FileName [Option]")

    parser.add_option("-f", "--file", type="string", dest="FileName",
        help="File name.")

    (opts, args) = parser.parse_args()

    print "opts", opts, len(opts) 
    print "args", args, len(args)
Was mache ich falsch?

Verfasst: Samstag 5. Dezember 2009, 13:05
von HWK
opts ist kein Dict, sondern eine Instanz der Klasse Values, für die len nicht implementiert ist.
Falls Du die Anzahl wirklich brauchst:

Code: Alles auswählen

len(opts.__dict__)
MfG
HWK

Verfasst: Sonntag 6. Dezember 2009, 12:33
von mit
Danke, aber es hilft mir nicht weiter (len(opts.__dict__)) denn wenn ich kein Parameter übergebe ist es 1 und wenn ich ein Parameter übergebe ist auch 1

Code: Alles auswählen

$ python2.5 test1.py
opts {'FileName': None}
args []
1
$ python2.5 test1.py -f kdfs
opts {'FileName': 'kdfs'}
args []
1
Was mache ich falsch?

Verfasst: Sonntag 6. Dezember 2009, 13:00
von Dav1d
Dann prüf doch einfach ob FileName gleich None ist

Code: Alles auswählen

opts['FileName'] == None

Verfasst: Sonntag 6. Dezember 2009, 13:17
von DasIch
Auf ``None`` kann und sollte man mit ``is`` testen.

Verfasst: Sonntag 6. Dezember 2009, 13:19
von mit
Danke, aber nun bekomme ich diese Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "test1.py", line 18, in <module>
    if opts['FileName'] == None:
AttributeError: Values instance has no attribute '__getitem__'
Was mache ich falsch?

Verfasst: Sonntag 6. Dezember 2009, 13:20
von Dav1d
versuchs mal mit:

Code: Alles auswählen

opts.__dict__['FileName'] is None

Verfasst: Sonntag 6. Dezember 2009, 13:22
von mit
Danke es funktioniert.

Verfasst: Sonntag 6. Dezember 2009, 13:49
von lunar
Dav1d hat geschrieben:versuchs mal mit:

Code: Alles auswählen

opts.__dict__['FileName'] is None
Da kann man auch gleich "opts.FileName is None" schreiben.

Verfasst: Sonntag 6. Dezember 2009, 19:57
von BlackJack
Das kann man nicht nur, das *sollte* man auch. `__dict__` ist ein Implementierungsdetail, das muss nicht vorhanden sein.

Verfasst: Montag 7. Dezember 2009, 23:11
von mit
Danke es funktioniert.