Werte per Eingabeaufforderung übergeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
NedNederlander
User
Beiträge: 10
Registriert: Mittwoch 4. März 2009, 13:25

Hallo,
ich habe ein Python-Programm geschrieben, und möchte nun sehr gerne beim Ausführen des Programmes Werte bzw. besser Wertebereiche für bestimme Parameter, die das Programm benutzt, übergeben. Bin leider nicht der erfahrenste Programmierer, und hab jetzt nach einer Weile googlen nichts passendes gefunden.

Wäre nett, wenn ihr mir ein paar Tipps in die richtige Richtung geben könntet, welche Lösungen sich für mich anbieten.


Danke!!!


PS: Ich arbeite primär mit Windows, kann zur ALLERGRÖSSTEN Not auch Ubuntu nehmen :-) aber Windows-Lösungen sind mir lieber, in Linux bin ich alles andere als fitt ;-)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Die Parameter die übergeben wurden sind in sys.argv zu finden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

DasIch hat geschrieben:Die Parameter die übergeben wurden sind in sys.argv zu finden.
Bevor man aber da mit irgend welchen Frickellösungen anfängt:
http://docs.python.org/library/getopt.html
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Oder noch besser: [mod]optparse[/mod]
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
BlackJack

IMHO ist `getopt` auch eine Frickellösung. ;-)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Hyperion hat geschrieben:Bevor man aber da mit irgend welchen Frickellösungen anfängt:http://docs.python.org/library/getopt.html
Mal abgesehen davon das getopt grausam ist lässt sich hier nicht absolut urteilen. Bei einem kleinen Skript mit einem LOC < 100 sind diese Lösungen absoluter schwachsinn.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:IMHO ist `getopt` auch eine Frickellösung. ;-)
Oops ... zu schnell verlinkt! Wollte eigentlich auf optparse linken ...

@DasIch: Das kommt doch aufs Problem an! Bei einem einzelnen Parameter kann man darauf verzichten. Werden es mehr, dazu noch einige als Flags, dann würde ich das nicht mehr per Hand machen wollen!

Ich wollte dem OP ja auch nur mitteilen, dass es für komplexere Aufgaben eben fertige Module gibt!
lunar

Bei einem kleinen Skript mit einem LOC < 100 sind diese Lösungen absoluter schwachsinn.
Und was hat man davon, wenn man darauf verzichtet? Freude daran, seine Kommandozeilenoptionen selbst zu parsen?
BlackJack

@lunar: Kommt drauf an, was da unter "parsen" fällt. Solange es sich zum Beispiel auf so Sachen wie ``verbose = '-v' in sys.argv`` beschränkt, ist `optparse` aufwändiger zu benutzen.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

lunar hat geschrieben:Und was hat man davon, wenn man darauf verzichtet? Freude daran, seine Kommandozeilenoptionen selbst zu parsen?
Sollte man unerwarteterweise doch zig Optionen haben kann es sinn machen aber die meisten dieser kleinen Skripte haben dass nicht. Da hat man i.d.R. eine handvoll Parameter die man in 2 Zeilen "geparst" hat.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

DasIch hat geschrieben: Sollte man unerwarteterweise doch zig Optionen haben kann es sinn machen aber die meisten dieser kleinen Skripte haben dass nicht. Da hat man i.d.R. eine handvoll Parameter die man in 2 Zeilen "geparst" hat.
Hm ... da würde mich mal ein Bsp. interessieren mit 3 Parametern, bei dem Du eine Typüberprüfung hast und dazu noch einen Hilfetext! Ich denke bereits da hat optparse Vorteile ...
NedNederlander
User
Beiträge: 10
Registriert: Mittwoch 4. März 2009, 13:25

gibts es auch eine möglichkeit - nehmen wir mal an ich benutze die sys.argv-methode - für eine variable, die vom programm genutzt wird, gleich merhere werte zu übergeben, z.B. einen ganzen bereich?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Klar. Da sys.argv eine Liste ist, kannst du per Slicing einen Bereich auswählen und einer Variable zuweisen.
Das Leben ist wie ein Tennisball.
NedNederlander
User
Beiträge: 10
Registriert: Mittwoch 4. März 2009, 13:25

EyDu hat geschrieben:Klar. Da sys.argv eine Liste ist, kannst du per Slicing einen Bereich auswählen und einer Variable zuweisen.

was bedeutet slicing?

ich meine nicht mehrere unterschiedliche variablen übergeben, sondern für eine variable mehrere unterschiedliche werte in einem einzigen durchlauf übergeben.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Code: Alles auswählen

import sys
names = sys.argv[1].split(',')
print '\n'.join(names)
Das dann z.B. so aufrufen:

Code: Alles auswählen

python print_names.py peter,bob,robert
Edit: hier noch ein Beispiel mit optparse:

Code: Alles auswählen

from optparse import OptionParser
parser = OptionParser()
parser.add_option('-n', '--names', help='a comma-seperated list of names', dest='names')
options, args = parser.parse_args()
print '\n'.join(options.names.split(','))
Dieses Skript wird dann z.B. wie folgt aufgerufen:

Code: Alles auswählen

python print_names2.py --names peter,bob,robert
Zuletzt geändert von derdon am Freitag 6. März 2009, 14:54, insgesamt 2-mal geändert.
NedNederlander
User
Beiträge: 10
Registriert: Mittwoch 4. März 2009, 13:25

vielen dank, das probier ich gleich mal aus.

bin noch kein programmier profi, da bin ich ab und zu auf kleien tipps angewiesen :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hyperion hat geschrieben:
DasIch hat geschrieben: Sollte man unerwarteterweise doch zig Optionen haben kann es sinn machen aber die meisten dieser kleinen Skripte haben dass nicht. Da hat man i.d.R. eine handvoll Parameter die man in 2 Zeilen "geparst" hat.
Hm ... da würde mich mal ein Bsp. interessieren mit 3 Parametern, bei dem Du eine Typüberprüfung hast und dazu noch einen Hilfetext! Ich denke bereits da hat optparse Vorteile ...
Wo bleibt mein Beispiel? :-D
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du nimmst ein dict und nutzt dass zum dispatchen. Bei den paar Parametern sollte ein einfacher Usage String, falls die Anzahl der Parameter o.ä. nicht stimmt, a la ``'USAGE: %s $foo $bar $baz' % sys.argv[0]`` reichen. Den Typ zu prüfen halte ich für überflüssig. Wenn notwendig gibt man die halt an und wer dass nicht liest und meint einfach irgendwas zu übergeben dürfte ziemlich schnell mit einer Exception begrüsst werden.
lunar

Talk is cheap. Show me the code.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Antworten