Negative Argumente ü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.
Antworten
kalli_P
User
Beiträge: 2
Registriert: Mittwoch 19. Februar 2014, 10:55

Ich möchte gerne negative Zahlen als Argumente übergeben, aber dann ist es gleich ein Kommando-Argument.

Beispiel: python Crawl_Flickr.py -s $pwd 37.685364 -121.773031 37.686364 -121.772931
Crawl_Flickr.py: error: no such option: -1

Die "-1" von -121.773031 wurde als Argument erwartet.

Code: Alles auswählen

from optparse import OptionParser
parser = OptionParser("Crawl_Flickr.py [Operation] Latitude_1 Longitude_2 Latitude_2 Longitude_2") 
parser.add_option("-s", "--save", dest="save_file", help="Save file to directory")
(args) = parser.parse_args()
save_dir = save_file.save_file

if len(args) != 4: 
    parser.error("4 Arguments were needed: Latitude_1 Longitude_2 Latitude_2 Longitude_2")
else:
    lat1=args[0]
    lon1=args[1]
    lat2=args[2]
    lon2=args[3]
BlackJack

@kalli_P: Benutze '--' beim Aufruf um das Ende der Optionen zu markieren und dem `OptionParser` zu sagen dass danach nur noch Positionsargumente folgen:

Code: Alles auswählen

python Crawl_Flickr.py -s $PWD -- 37.685364 -121.773031 37.686364 -121.772931
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Oder Hochkommas bei der Parameterübergabe verwenden.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
kalli_P
User
Beiträge: 2
Registriert: Mittwoch 19. Februar 2014, 10:55

Danke euch beiden
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Ansonsten ist es auch üblich, negative Werte zu klammern.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
BlackJack

@darktrym: Das nützt nichts denn die wird das Programm nie sehen — die sind für die Shell und die übergibt sie nicht dem aufgerufenen Programm.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hi BlackJack,
BlackJack hat geschrieben:@darktrym: Das nützt nichts denn die wird das Programm nie sehen — die sind für die Shell und die übergibt sie nicht dem aufgerufenen Programm.
was meinst Du, die Hochkommas? Ist das nicht gewollt, dass das Programm nur die negativen Werte ohne Hochkommas bekommt? Ich hätte alternativ auch Anführungsstriche vorgeschlagen.

VG
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Sicher ist das gewuenscht, nur haelt das dann `optparse` nicht davon ab die Werte als Optionsparameter zu interpretieren.
Insofern loest Shell-Quoting jeder Art nicht das Problem hier.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Ok, sorry, habe "OptionParser" von BlackJack nicht als Modul sondern als Prozessschritt beim Skriptstart gelesen. Was passiert, wenn man Anführungsstriche und Hochkommas verwendet? Interpretiert OptionParser die Parameter dann gleich als String?
Diese Nachricht zersört sich in 5 Sekunden selbst ...
BlackJack

@Michael Schneider: Ich verstehe die Frage nicht — Wenn man in der Shell ein Argument in Hochkommas/Anführungszeichen einfasst kommt das beim OptionParser gar nicht an, die sind ja für die Shell und die entfernt die. Wenn man die vor der Shell schützt, dann sind sie ganz normal Teil des Arguments.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Ich habe es so verstanden, dass wenn man '-15' an das Skript übergibt, die Shell die ' entfernt und an das Skript -15 übergibt, welche dann vom OptionParser als Option interpretiert wird.

Meine Frage war, was passiert, wenn man dem Skript '"-15"' übergibt. Ob dann beim OptionParser "-15" ankommt, die er entweder als String "-15" oder als Zahl -15 interpretiert.
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

In Sachen XY-Problem: Gibt es einen Grund, wieso Du nicht ``argparse`` einsetzt?

Evtl. wäre das hier auch eine Lösung für ``optparse``.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Michael Schneider: Beim `OptionParser` kommt dann "-15" an, also mit Anführungszeichen und Positionsargumente sind grundsätzlich Zeichenketten. Bei `argparse` kann man auch bei Positionsargumenten Typen angeben und wenn man dort angibt es soll eine Zahl sein, dann würde es einen Fehler geben weil "-15" nicht in eine Zahl umgewandelt werden kann.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Hat schon seinen Grund warum ich noch bei getopt stehengeblieben bin.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@darktrym: Und der wäre?
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Man gibt kurze und lange Optionen an und alles was er nicht erkennt sind dann normale Parameter. In diesem Fall werden die negativen Zahlen nicht als Option interpretiert. Die Auswertung erfolgt in einer Schleife, so kann die Position der Optionen varieren. Der Syntax ist einleuchtend aber nicht ganz pythonisch, kommt schließlich aus der GNU Ecke.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Antworten