Config auslesen mit ConfigObject

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
Requester
User
Beiträge: 26
Registriert: Samstag 10. Mai 2008, 21:59

So, ich mache mal einen neuen Thread auf, weil das jetzt nichts mehr mit dem vorherigen Problem zu tun hat, mir sei verziehen.

Ich habe mir mal Config Object vorgenommen, das ist ja wirklich einfach damit und echt nen super Modul.

Aber ich hab da irgendwie noch nen kleines Problem.

Meine Config sieht folgendermaßen aus:
[CONF]
window_x = 136
window_y = 44
framed_inspector = 0
splitter_pos = 215
In der ersten Zeile, sieht man ein "[CONF]", das Problem, ConfigObj kann ohne diese erste Zeile die Config nicht lesen.

Gibt es irgend eine Möglichkeit das Config Object in der 2. Zeile erst an zu lesen fängt? Den das Programm möchte ich eigentlich nicht ändern, das "[CONF]" soll trotzdem dort bleiben.

So lese ich die config aus:

Code: Alles auswählen

con = ConfigObj('test.conf')
v1 = con['window_y']
print v1
Kann ich den irgendwie dazu bringen erst ab Zeile 2 anzufangen?

Wäre echt toll wenn mir dabei einer helfen kann, ich hab einfach keine Idee wie ich das realisieren könnte. Danke schon mal.

Gruß Requester
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Die angabe der Section soll bleiben aber du willst es trotzdem überspringen? Das ist doch irgendwie ein Widerspruch. Was hast du denn genau vor? Es ist sicherlich einfacher, das eingelesene Ergebnis nachzubearbeiten.
Requester
User
Beiträge: 26
Registriert: Samstag 10. Mai 2008, 21:59

EyDu hat geschrieben:Die angabe der Section soll bleiben aber du willst es trotzdem überspringen? Das ist doch irgendwie ein Widerspruch. Was hast du denn genau vor? Es ist sicherlich einfacher, das eingelesene Ergebnis nachzubearbeiten.
Also eigentlich will ich die config einfach nur auslesen. Was aber nicht funktioniert, weil eben in der ersten Zeile [CONF] steht, ist das verständlich?

Ich möchte die config aber trotzdem lesen und das irgendwie überspringen. Ergo: Das [CONF] soll bleiben und ich möchte trotzdem die Config lesen können, dafür muss es doch eine Lösung geben oder?

Gruß Requester
lunar

Häh? Irgendwie verstehe ich dein Problem nicht so ganz...

Was spricht denn gegen folgendes?

Code: Alles auswählen

config = ConfigObj('test.conf')
print config['CONF']['window_y'] 
Requester
User
Beiträge: 26
Registriert: Samstag 10. Mai 2008, 21:59

Stimmt klappt, bin ich gar nicht drauf gekommen. Danke schön! :D
Requester
User
Beiträge: 26
Registriert: Samstag 10. Mai 2008, 21:59

Ok, um das Thema nochmal auf zu greifen, ich versuch´s dann noch mal selber. :wink:

Hab das jetzt mal so gemacht:

Code: Alles auswählen

def testConf():
    config = ConfigObj('test.conf') 
    con = config['test_var']

    if int(con) == 1:
        return 'TEST1'
    else:
        return 'TEST'

Allerdings bekomme ich jetzt so eine Fehlermeldung:
"F:\Python\Testing\readconf.py", line 74, in testConf
con = config['test_var']
File "E:\Python25\lib\configobj.py", line 580, in __getitem__
val = dict.__getitem__(self, key)
KeyError: 'test_var'
Deshalb bin ich auch so ratlos warum das nicht klappt.
Wenn ich das ganze in einer einzelnen Python Datei mache klappt das wunderbar. Aber wenn ich das jetzt in dieses Programm einbaue kommt es zu diesem Fehler.

Deshalb weiß ich einfach nicht weiter. Hat jemand ne Idee woher das kommt?

Gruß Requester
Zuletzt geändert von Requester am Sonntag 18. Mai 2008, 15:57, insgesamt 1-mal geändert.
lunar

Abgesehen davon, dass dein Codesnippet einen Syntaxfehler enthält, liegt der Fehler schlichtweg darin, dass der Schlüssel nun mal nicht in der Config-Datei existiert.

Sollte ich raten, würde ich sagen, dass die Arbeitsverzeichnisse sich unterscheiden, und im Programm deswegen eine andere Config-Datei geladen wird als beim Testen.
Requester
User
Beiträge: 26
Registriert: Samstag 10. Mai 2008, 21:59

lunar hat geschrieben:Abgesehen davon, dass dein Codesnippet einen Syntaxfehler enthält, liegt der Fehler schlichtweg darin, dass der Schlüssel nun mal nicht in der Config-Datei existiert.

Sollte ich raten, würde ich sagen, dass die Arbeitsverzeichnisse sich unterscheiden, und im Programm deswegen eine andere Config-Datei geladen wird als beim Testen.
Jo, stimmt den hatte ich irgendwie nich mitkopiert, Syntax Fehler ist behoben.

Ja, im Programm selber wird eine andere Config geladen das stimmt. Allerdings ist das mit Built-In gelöst, also alle Dateien die beim Start iniziert werden, in denen hat man keinen Zugriff auf die Programm Eigene Config.

Das ist leider sehr ungünstig, da ich gerne einige Features hinzufügen möchte, dummerweise werden einige Dateien eben beim Start iniziert und ich kann nicht auf die Config zugreifen.

Ich dachte jetzt wenn ich einfach eine "eigene" Config schreibe, kann ich auch in diesen Dateien auf eine Config zu greifen, nur da kommt halt dieser Fehler.

Ich weiß jetzt gar nicht ob es dann überhaupt Möglich ist, mit einer config zu arbeiten in diesen Dateien.

Ich hoffe du verstehst was ich meine. :wink:

Gruß Requester
lunar

Requester hat geschrieben:Ich hoffe du verstehst was ich meine. :wink:
Ehrlich gesagt, nein.

Ich verstehe weder, was du mit "indiziert" meinst, noch worum es überhaupt geht.
Requester
User
Beiträge: 26
Registriert: Samstag 10. Mai 2008, 21:59

lunar hat geschrieben:
Requester hat geschrieben:Ich hoffe du verstehst was ich meine. :wink:
Ehrlich gesagt, nein.

Ich verstehe weder, was du mit "indiziert" meinst, noch worum es überhaupt geht.
Wo hab ich den "indiziert" geschrieben?

Also. Ja, es ist schwer wenn man der Fachsprache nicht so mächtig ist. :(

Das Programm hat eine eigene Config. Man kann von überall aus auf die Config zugreifen, also von allen Dateien, ausser von denen die direkt beim Start "geladen" werden.

Nur leider genau in einer solchen Datei möchte ich ein paar, per Gui auswählbare Optionen einbauen. Um das Möglich zu machen muss natürlich eine Config her. Da ich aber aus den oben genannten Gründen in genau dieser Datei keinen Zugriff auf die Config habe bzw. keine config variablen importieren kann, wollte ich die Config in dieser Datei selber auslesen.

Mit ConfigObj nämlich. Aber es funktioniert einfach nicht und die oben geschriebene Fehler Meldung kommt.

Wenn du es jetzt immer noch verstanden hast, weiß ich auch nicht mehr wie ich das erklären soll. :oops:
lunar

Requester hat geschrieben:
lunar hat geschrieben:
Requester hat geschrieben:Ich hoffe du verstehst was ich meine. :wink:
Ehrlich gesagt, nein.

Ich verstehe weder, was du mit "indiziert" meinst, noch worum es überhaupt geht.
Wo hab ich den "indiziert" geschrieben?
Typo meinerseits, ich meine deine Wortschöpfung "iniziert".
Das Programm hat eine eigene Config. Man kann von überall aus auf die Config zugreifen, also von allen Dateien, ausser von denen die direkt beim Start "geladen" werden.
Irgendwie muss das Programm seine Konfiguration ja auch auslesen. Wie wäre es also, wenn du dir einfach mal anschaust, wie das Programm das macht, anstatt deine eigene Konfiguration zu implementieren?
Mit ConfigObj nämlich. Aber es funktioniert einfach nicht und die oben geschriebene Fehler Meldung kommt.
Ich habe dir gesagt, was der Fehler bedeutet: Der entsprechende Schlüssel ist nicht in der Datei enthalten! Warum der Fehler kommt, kann ich dir beim besten Willen nicht sagen, dafür sind die gegebenen Informationen viel zu spärlich. Ich kann – mangels Code – das Problem hier noch nicht mal selbst nachvollziehen, wie soll ich es dann bei dir beseitigen? ;)
Requester
User
Beiträge: 26
Registriert: Samstag 10. Mai 2008, 21:59

lunar hat geschrieben: Irgendwie muss das Programm seine Konfiguration ja auch auslesen. Wie wäre es also, wenn du dir einfach mal anschaust, wie das Programm das macht, anstatt deine eigene Konfiguration zu implementieren?
Ja, natürlich. Die Config Variablen werden in einer Datei gespeichert die von allen Dateien aus erreichbar ist. Ausser eben den bei denen es nicht geht.

Ich weiß auch genau wie das funktioniert, nur nützt mir das ja nichts wenn ich das anwenden will in einer Datei wo die config nicht geladen werden kann.

Ich habe auch schon mit dem Coder des Programms geredet gehabt, der hat mir das noch mal erklärt warum das so ist und das es eben mit der Programm internen config nicht gehen wird.
lunar hat geschrieben: Ich habe dir gesagt, was der Fehler bedeutet: Der entsprechende Schlüssel ist nicht in der Datei enthalten! Warum der Fehler kommt, kann ich dir beim besten Willen nicht sagen, dafür sind die gegebenen Informationen viel zu spärlich. Ich kann – mangels Code – das Problem hier noch nicht mal selbst nachvollziehen, wie soll ich es dann bei dir beseitigen? ;)
Mhm, soll ich das komplette Programm hochladen? :lol:
Ich weiß nicht wie ich das noch weiter ausführen kann.
Requester
User
Beiträge: 26
Registriert: Samstag 10. Mai 2008, 21:59

Ok, da das mit ConfigObj ja nicht hinhaut, würde ich es gerne mit dem Config Parser versuchen. Doch irgendwie werd ich aus dem nicht ganz schlau.

Hab das jetzt so gemacht:

Code: Alles auswählen

import ConfigParser

config = ConfigParser.ConfigParser()
config.readfp(open('test.conf'))
Jetzt sollte ja schon mal die Config geladen sein.

Aber wie genau greift man jetzt auf einzelne Variablen innerhalb der Config zu? Bin aus der Python Hilfe irgendwie nicht schlau geworden.

Config sieht nach wie vor so aus:
[CONF]
window_x = 136
window_y = 44
framed_inspector = 0
splitter_pos = 215
Wäre nett wenn mir da jemand bei helfen könnte. :)
lunar

Code: Alles auswählen

config = ConfigParser()
config.read(['test.cfg'])
print config.getint('CONF', 'window_x')
Requester
User
Beiträge: 26
Registriert: Samstag 10. Mai 2008, 21:59

Danke schön!

Habe mal eine Datei zum testen angelegt. Die sieht so aus:

Code: Alles auswählen

import ConfigParser


config = ConfigParser()
config.read(['test.conf'])
print config.getint('CONF', 'window_x')
Leider krieg ich immer diese Fehlermeldung:
config = ConfigParser()
TypeError: 'module' object is not callable
Komisch, hab das doch importiert?
lunar

Wenn du "import ConfigParser" ausführst, musst du auch "ConfigParser.ConfigParser" nutzen. Wenn dir das zu lang ist, nutze eben einen "from"-Import.

Nichts für ungut, aber langsam bewegen wir uns wirklich auf rtfm-Niveau. Diese und die letzte Frage hättest du dir durch einen kurzen Blick in die Doku selbst beantworten können. Ein bissen Eigeninitiative kann ich auch voraussetzen. Vielleicht solltest du erstmal das Tutorial durcharbeiten und dich ein bisschen einlesen, bevor du dich an Python-Programme wagst ;)
Requester
User
Beiträge: 26
Registriert: Samstag 10. Mai 2008, 21:59

lunar hat geschrieben:Vielleicht solltest du erstmal das Tutorial durcharbeiten und dich ein bisschen einlesen, bevor du dich an Python-Programme wagst ;)
Alles klar Chef, werde ich beherzigen. :wink:

Danke noch mal!

Gruß Requester
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Du kannst von einem Modul keine Instanz erzeugen. Du brauchst das ConfigParser Objekt das in dem Modul liegt.

Code: Alles auswählen

import ConfigParser
In [2]: ConfigParser
Out[2]: <module 'ConfigParser' from 'C:\Python25\lib\ConfigParser.pyc'>

In [3]: ConfigParser.ConfigParser
Out[3]: <class ConfigParser.ConfigParser at 0x00EABAE0>
Ich würde dir empfehlen mehr mit der interaktiven Konsole zu experimentieren um ein Verständnis für Module und Klassen in Python zu bekommen.

UPS :oops:, da gab es ja schon "antworten"
Antworten