Seite 2 von 2
Re: Frage zu dateien lesen
Verfasst: Montag 10. September 2012, 12:45
von BlackJack
@Tobbel: Natürlich liegt es daran. Spiel das doch mal im Kopf oder auf einem Blatt Papier Schritt für Schritt für einen Abschnitt durch. Dann sollte sehr schnell klar werden warum das so nicht funktionieren kann.
Re: Frage zu dateien lesen
Verfasst: Montag 10. September 2012, 12:55
von Tobbel
Dann hatte ich das doch leider richtig verstanden was EyDu meinte, jedoch verstehe ich dann nicht ob/was ich noch anders eintragen muss an den gegebenen stellen , also an
sodass es mir in der späteren Abfrage nach "plugin_output" ,nicht wie jetzt einen KeyError ausgibt, ihm fehlt ja dann hier die Zuweisung...
Muss hier zuvor noch irgendwas als globale variable o.ä. definiert werden?
Steh grad ein wenig aufm schlauch was das angeht...
hier noch die Fehlermeldung
Code: Alles auswählen
File "lampe2.py", line 106, in <module>
Main(sys.argv[1:])
File "lampe2.py", line 97, in Main
if ("OK" in servicestatus["plugin_output"] and
KeyError: 'plugin_output'
Re: Frage zu dateien lesen
Verfasst: Montag 10. September 2012, 13:10
von sparrow
Zeig die entsprechende Codestelle bitte und schreib mal hinter jede Zeile als Kommentar (print "hallo" # schreibt hallo) was du denkst was sie tut. Und zwar die komplette Schleife, nicht nur die drei Zeilen der Zuweisung. Es scheint mir, dass du noch nicht so ganz verstanden hast, was dieses ganze yield-Gedöns macht. Das können wir nur schnell erledigen, wenn du sagst was du meinst, das es ist.
Re: Frage zu dateien lesen
Verfasst: Montag 10. September 2012, 13:29
von Tobbel
Code: Alles auswählen
def auslesen(status2):
with open(status2) as statuspart:
servicestatus = None #weist der variablen servicestatus den Wert None zu
for line in (l.strip() for l in statuspart): #"räumt" zeile für zeile auf
if line.endswith("{"): #untersucht ob die jeweilige Zeile mit einer { endet
servicestatus = {} #falls obriges zutrifft wird servicestatus ein leeres dictionary zugewiesen
print "test1"
elif line.startswith("}", 0, len(line)): #sucht nach dem schließ-punkt für das dictionary und gibt mit yield den generator weiter der dann...
yield servicestatus
servicestatus = None
print "test2"
elif servicestatus is not None and line: # ...hier das Dictionary befüllt haben sollte um dann später...
name, value = line.split("=", 1)
servicestatus[name] = value # <-- sollte aus allen ausgelesen zeilen eine art "tupel" machen der durch das = getrennt ist
print "test3"
def Main(argv):
print "Sollte angezeigt werden..."
for servicestatus in auslesen("/home/tweber/status2.dat"): #...und zwar hier, geladen zu werden
print "das hier auch..."
if ("OK" in servicestatus["plugin_output"] and # um hier nach den parametern abgesucht werden zu können
servicestatus["problem_has_been_acknowledged"] == "0" and
servicestatus["scheduled_downtime_depth"] == "0"):
print "wuhu"
else:
print "meh..."
if __name__ == "__main__":
Main(sys.argv[1:])
So das sollte es sein, ich hoff man verzeiht mir das ich noch ein beginner in python bin...
Wenn jemand im Ruam Freiburg wohnt, darf er sich auf ein Bier eingeladen fühlen
Edit: bekomme mit diesem Code nun den fehler:
Code: Alles auswählen
tweber@buero01:~$ python lampe2.py
Sollte angezeigt werden...
das hier auch...
Traceback (most recent call last):
File "lampe2.py", line 110, in <module>
Main(sys.argv[1:])
File "lampe2.py", line 101, in Main
if (servicestatus["plugin_output"].startswith("OK", 5, len(servicestatus["plugin_output"])) and
TypeError: 'NoneType' object is not subscriptable
Re: Frage zu dateien lesen
Verfasst: Montag 10. September 2012, 13:40
von sparrow
Ich würde (vorsichtshalber) folgende Änderung vornehmen:
zu
Code: Alles auswählen
elif line.startswith("}", 0, len(line)) and servicestatus:
Wenn servicestatus none ist, ist die Bedingung nicht erfüllt, dann wird kein None-Objekt zurück gegeben.
Ansonsten funktioniert dein Code hier wunderbar. Das Problem, dass du jetzt nur auf hoststatus { geprüft hast, hast du ja selbst gefunden und korrigiert.
Re: Frage zu dateien lesen
Verfasst: Montag 10. September 2012, 13:48
von Tobbel
Ich versteh zwar nicht ganz warum das jetzt richtig funktioniert, aber seit das "and servicestatus" als Bedingung dabei steht gibt er keinen fehler mehr aus... es wurde doch lediglich die Menge der "gesplitteten" spalten verringert...
Naja es funktioniert nun! Vielen Dank an alle die sich die Mühe gemacht haben!
Und wie gesagt, Raum Freiburg --> Pn --> Gratis-getränk nach wahl
Gruß Tobi
Re: Frage zu dateien lesen
Verfasst: Montag 10. September 2012, 13:56
von sparrow
Wenn vorher ein } in der Datei stand, hat er automatisch servicestatus "zurückgegeben", auch wennd das noch None war, weil nämlich gar kein { vorbei gekommen ist.
Wenn servicestatus None ist, ist das Testen mit if aber immer False, also wird nichts zurückgegeben, wenn nicht überhaupt ein servicestatus-Objekt erstellt wurde. Du hättest also auch schreiben können ... and servicestatus is not none