IndexError: list index out of range

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
koxbox
User
Beiträge: 11
Registriert: Donnerstag 27. Februar 2014, 13:45

Hallo,

ich hatte da mal wieder ein Frage.

z.B.

ich habe hier ein CentOS und ein Oracle Linux.
ich will nun herausfinden um welches Btriebssystem es sich handelt und welche Version.

#centos
RELEASE = open('/etc/system-release', 'r').readline().rsplit()[0] # CentOS
VERSION = open('/etc/system-release', 'r').readline().rsplit()[2][:1] # 6

#oracle linux
RELEASE = open('/etc/system-release', 'r').readline().rsplit()[0] # Oracle
VERSION = open('/etc/system-release', 'r').readline().rsplit()[4][:1] # 6

wenn ich jetzt diese variablen in einem CentOS abfrage bekomme ich den Fehler:
IndexError: list index out of range

da es den Wert [4][:1] bei CentOS nicht gibt.

Warum bricht das Script an dieser stelle ab.
Was ist die Lösung damit es weitergeht?

Man fragt doch öfter Dinge ab die evtl. bei dem einen oder anderen Sytsem nicht existieren.
BlackJack

@koxbox: Warum sollte das an der Stelle nicht abbrechen? Was würdest Du denn erwarten was das Ergebnis eines Indexzugriffs ist an einem Index den es nicht gibt?

Was man da jetzt genau macht, kommt auf die Problemstellung an. Man sollte Code der für Oracle Linux ist, unter CentOS nicht ausführen. Das macht ja so auch überhaupt keinen Sinn wenn der Code für Oracle Linux die Werte die für CentOS ermittelt wurden, wieder überschreibt. Also erst das System ermitteln und dann in Abhängigkeit davon die Version.

Der Quelltext ist übrigens auch sonst nicht besonders gut. Um die selbe Zeile in der selben Datei zu verarbeiten, wird die jedes mal geöffnet, eingelesen, und zerlegt. Ernsthaft? Zumal die Dateiobjekte auch allesamt nicht explizit wieder geschlossen werden. Dateideskriptoren sind eine Ressource die nicht in unendlicher Menge zur Verfügung steht, darum sollte man die durch schliessen der Datei wieder freigeben. Um das sicherzustellen verwendet man in Python üblicherweise die ``with``-Anweisung.
koxbox
User
Beiträge: 11
Registriert: Donnerstag 27. Februar 2014, 13:45

@Blackjack.

ich habe ein script das ich laufen lassen will.
dieses soll erstmal herausfinden auf welcher platform es sich befindet,

also bin ich ein centos oder bin ich ein oracle und habe ich die version 6.

bei dem centos frage ich das mit platform.linux_distribution()
und hole mir da dann OS und Version heraus.

bei Oralce linux funktionert platform.linux_distribution() nicht.. es gibt mir da aus das es ein RedHat sei.

also lese ich zusätzlich die datei /etc/system-release aus um zu sehen ob es ein Oracle linux ist.
diese datei gibt es sowohl auf centos wie auch bei oracle. nur der inhalt der ausgbe ist anders.

dann frage ich imit if und elif ab und vergleiche.

if var == centos and version is 6
do
elif if var == oracle and version is 6
do
else
ist kein centos und auch kein oracle.
BlackJack

@koxbox: Das habe ich soweit schon verstanden, was ich nicht verstehe ist der Code der anscheinend versucht die Oracle-Version zu lesen auch wenn vorher schon ermittelt wurde das es kein Oracle ist. Die Information ist zu dem Zeitpunkt ja schon vorhanden, also kann man sie auch verwenden.

Was ist denn der Unterschied zwischen Oracle und RedHat den Du berücksichtigen musst? Denn letztendlich *ist* ein Oracle Linux ja auch ein RedHat-Linux.

Da der letzte „Pseudocode” sehr nahe an Python ist: Du vergleichst hoffentlich in echtem Python-Quelltext keine Zahlen mit ``is``‽ Das wäre ein Programmierfehler, denn es ist nicht garantiert das Zahlen mit dem gleichen Wert auch das selbe Objekt sind.
koxbox
User
Beiträge: 11
Registriert: Donnerstag 27. Februar 2014, 13:45

BlackJack hat geschrieben:was ich nicht verstehe ist der Code der anscheinend versucht die Oracle-Version zu lesen auch wenn vorher schon ermittelt wurde das es kein Oracle ist. Die Information ist zu dem Zeitpunkt ja schon vorhanden, also kann man sie auch verwenden.
also wenn ich das script auf einem system laufen lassen will um es abzufragen was es ist. muss ich ja wohl beides abfragen oder?
BlackJack hat geschrieben:Was ist denn der Unterschied zwischen Oracle und RedHat den Du berücksichtigen musst? Denn letztendlich *ist* ein Oracle Linux ja auch ein RedHat-Linux.
das ist nicht meine frage gewesen.
BlackJack hat geschrieben:Da der letzte „Pseudocode” sehr nahe an Python ist: Du vergleichst hoffentlich in echtem Python-Quelltext keine Zahlen mit ``is``‽ Das wäre ein Programmierfehler
ich vergeiche mit ==
BlackJack

@koxbox: Ja Du musst beides abfragen, aber doch nicht so. Vor allem musst Du die Version nicht abfragen wie Du das auf einem Oracle Linux machen würdest, wenn Du bereits ermittelt hast, dass es sich gar nicht um ein Oracle Linux handelt, sondern um ein CentOS. Die vier Zeilen im ersten Beitrag einfach so hintereinander zu schreiben macht schlicht keinen Sinn, egal um welches System es sich handelt. Denn mal angenommen es gäbe einen fünften Eintrag in der Liste bei CentOS, dann würde Dir diese Zeile die CentOS-Version überschreiben die bei CentOS ja an dritter Stelle in der Liste steht.

Also ermittele das System, und dann *abhängig* vom System die Version. Wenn CentOS dann tu dieses, wenn Oracle Linux dann tu jenes um die Version zu ermitteln.

Ausnahmebehandlung und der Fall das es weder CentOS noch Oracle Linux ist, sollte man natürlich auch berücksichtigen. Bist Du im Tutorial in der Python-Dokumentation schon bei Ausnahmen gewesen?

Das ganze wäre auch besser in einer Funktion aufgehoben.
koxbox
User
Beiträge: 11
Registriert: Donnerstag 27. Februar 2014, 13:45

@BlackJack

ich habe hier ein Buch "Peter Walerowski - Python - Grundlagen und Praxis"

aber ich denke ich weiss was du meinst.

Erst einmal abfragen ob es sich um centos oder oracle handelt und danach erst wenn das feststeht die Version abfragen.
Dann versuche ich das mal über eine Funktion zu lösen.
Antworten