Außerhalb einer Funktion kann man doch aber die Variablen hinzufügen, oder? Hier wird mein Parser ausgeführt, es ist quasi das erste was bearbeitet wird.
Vielleicht nur einmal um meine Seite noch einmal genauer zu beschreiben:
Mein Programm prüft ob eine Anwendung einen Fehler meldet oder überhaupt ausgeführt wird. Dieses Programm wird auf mehreren Rechnern ausgeführt. Nun kann es aber durchaus vorkommen, dass sich der Anwendungsname oder der Pfad zur Anwednung sich ändert oder diese sogar variieren, da es wie gesagt auf mehreren Systemen zum einsatz kommt. Hier fand ich die Lösung, die Pfade und den Dateinamen über eine Config-Datei zu managen sehr schön:
Code: Alles auswählen
[Default]
Pfad_0 = "C:\\........\\"
Pfad_1 = "D:\\........\\"
Pfad_2 = "M:\\........\\"
Anwendung_0 = "Programm_64bit.exe"
Anwendung_1 = "Programm.exe"
Timeout = 12
MaxErrorcount = 3
....
Hier kann es aber durchaus sein, dass sich auf
einem (!) Rechner der Pfad ändert oder die Programmversion
zusätzlich eine andere ist. Hierfür möchte ich dann in die Config-Datei ein 'Pfad_3 = "X:\\.......\\"' oder ein 'Anwendung_2 = "Programm_v2.exe"' einfügen und sonst nichts. Wenn ich dann dafür in die py-Datei einsteigen muss, um später mittels py2exe das Skript in eine eigenständige Anwendung umzuwandeln, dann bräuchte ich keine config.ini und es wäre auch sehr mühselig, vielleicht nur wegen einer kleinen Änderung im Pfad.
Klar kann man in der Config.ini fehler machen, aber diese werden einem dann so gut es geht mitgeteilt - soweit zumindest der Plan. In der python-Datei werden zudem am Anfang Defaultwerte geladen, so dass wenn mal die Datei verloren geht, nicht das ganze nie wieder funktioniert. Und selbst wenn würde es nicht darin ausarten, dass alles einfriert und man ohne infos dasteht, da auch alles in einer Logdatei geschrieben wird.
Code: Alles auswählen
parser = SafeConfigParser()
parser.optionxform = str #Legt fest, dass der eingelesene String CaseSensitive ist (Default: LowerCase)
parser.read('config.ini')
for section_name in parser.sections():
print "config.ini Data:"
for name, value in parser.items(section_name):
print ' %s = %s' % (name, value)
try: #erst versuchen einen integer zu bekommen
exec("%s=%i" % (name,value))
except:
pass #wenn das nicht funktioniert....
try: #.....dann versuchen einen String zu bekommen
exec("%s=%s" % (name,value))
except SyntaxError:
print ""
print " SyntaxError while loading the config.ini. Datafields must be a integer or a string"
print ""
except:
print ""
print " Unexpected error while loading the config.ini - please check the file."
print ""
print
Danach versuche ich grade "Pfad_
n" zu einem "Pfad = [......, ....., .....]" zusammenzufügen, damit ich alle Pfade nach einander prüfen kann.
Sicherlich gibt es viele schönere Lösungen, aber ich bin erstmal insgesamt froh darüber, dass das Skript läuft und auch mehrere Tage im Dauerlauf überstanden hat. Nichts desto trotz interessieren mich natürlich aber auch die besseren Lösungen, da ich noch ein Python-Anfänger bin. Bevor einer aber sagt, dass es nicht geht und das ich das Skript so nicht ausführen sollte, lasse ich es lieber so und freue mich, dass die gewünschte Anwendung dauerhaft kontrolliert und korrekt neugestartet wird.