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
Werte per Eingabeaufforderung übergeben
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Bevor man aber da mit irgend welchen Frickellösungen anfängt:DasIch hat geschrieben:Die Parameter die übergeben wurden sind in sys.argv zu finden.
http://docs.python.org/library/getopt.html
- 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
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
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.Hyperion hat geschrieben:Bevor man aber da mit irgend welchen Frickellösungen anfängt:http://docs.python.org/library/getopt.html
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Oops ... zu schnell verlinkt! Wollte eigentlich auf optparse linken ...BlackJack hat geschrieben:IMHO ist `getopt` auch eine Frickellösung.
@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!
Und was hat man davon, wenn man darauf verzichtet? Freude daran, seine Kommandozeilenoptionen selbst zu parsen?Bei einem kleinen Skript mit einem LOC < 100 sind diese Lösungen absoluter schwachsinn.
@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.
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.lunar hat geschrieben:Und was hat man davon, wenn man darauf verzichtet? Freude daran, seine Kommandozeilenoptionen selbst zu parsen?
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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 ...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.
-
- 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?
-
- 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.
Code: Alles auswählen
import sys
names = sys.argv[1].split(',')
print '\n'.join(names)
Code: Alles auswählen
python print_names.py peter,bob,robert
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(','))
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.
-
- 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
bin noch kein programmier profi, da bin ich ab und zu auf kleien tipps angewiesen
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Wo bleibt mein Beispiel?Hyperion hat geschrieben: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 ...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.
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.