Config als globale variable geht nicht

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
uwerothfeld
User
Beiträge: 17
Registriert: Freitag 24. Juni 2011, 14:18

Hall zusammen,

ich lade eine externe config Datei per:

Code: Alles auswählen

if __name__ == "__main__":

    # read the programm config
    config = {}
    exec(open("testsuite.conf").read(), config)
    sys.exit(main())

In dem lokalen Script geht das auch. Wenn ich aber dann ein anderes Modul instanziiere und ausführe, welches ebenfalls auf die config zugreift, bekomme ich:
line 52, in __read_test_case
op.vm_name = row[config["TEST_CASE_COLUMN_NAME_VM"]]
NameError: global name 'config' is not defined
Jemand nen Tip? Danke schon einmal.

Jan
BlackJack

@uwerothfeld: Der Tip wäre keine globalen Variablen verwenden zu wollen.

Eine übliche Technik ist es ein `config`-Modul zu haben und das in all den Modulen zu importieren wo man die Konfigurationsdaten verwenden will.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Exec stinkt immer ein bisschen. Speicher das ganze doch als JSON und lade es dann einfach.

Und schließe die Datei vernünftig nachdem du sie benutzt hast. Niemand garantiert dir wann das Dateiobjekt freigegeben und somit die Datei geschlossen wird.
uwerothfeld
User
Beiträge: 17
Registriert: Freitag 24. Juni 2011, 14:18

Hallo zusammen,

das sind ja schon ein paar Idee. :D ich habe bei stack overflow recherchiert und da wurde die config lösung als der übliche weg beschrieben. JSON finde ich ehrlich gesagt für meinen fall ungünstig. es soll nen kleines konsolenprogramm sein. dazu soll man schnell die config editieren können.

wenn ich ein config modul habe, sind dann auch alle werte die darin geladen werden global zugreifbar? kannst du mal ein paar codezeilen anreißen, steh gerade auf dem schlauch. :D

das laden ist so nicht sauber, stimmt. werd ich auf jeden fall ändern.

besten dank schonmal.
BlackJack

@uwerothfeld: Das Modul kannst Du in jedem anderen Modul importieren und dann auf die Attribute des Moduls zugreifen. Ich weiss jetzt nicht was für Codebeispiele man da zeigen soll. ``import config`` halt.
uwerothfeld
User
Beiträge: 17
Registriert: Freitag 24. Juni 2011, 14:18

hallo blackjack,

das mit dem import ist klar. :D aber wie mach ich es, dass singleton mäßig die config nur einmal geladen wird? oder muß ich dann im __init__ der class entsprechen config.load() machen?

uwe ;)
uwerothfeld
User
Beiträge: 17
Registriert: Freitag 24. Juni 2011, 14:18

hallo nochmal,

so dann?

Code: Alles auswählen

class Configuration(object):

    def __init__(self, file_name = "testsuite.conf"):

        config = {}
        config_file_name = file_name
        # read the programm config
        load_config(config_file_name)

    def load_config(self, config_file):
        with open(config_file, 'r') as f:
            exec(f.read(), config)

    def __str__(self):
        return self.__to_string()

    def __unicode__(self):
		return unicode(self.__to_string())

    def __repr__(self):
		return "Configuration()"

    def __to_string(self):
        return self.vm_name + " " + self.link_state + " " + self.time

    @property
    def config(self):
        return self.__config

    @config.setter
    def config(self, config):
        self.__config = config

    @property
    def config_file_name(self):
        return self.__config_file_name

   @config_file_name.setter
    def config_file_name(self, config_file_name):
        self.__config_file_name = config_file_name
oder wie?
BlackJack

@uwerothfeld: Die `config.py` *enthält* die Konfiguration. Kein Grund für eine Klasse oder irgendwelche extra Verrenkungen.

Wobei ich die Vorbehalte gegen JSON nicht nachvollziehen kann. Eine JSON-Datei in einem Textmodus-Editor zu bearbeiten ist doch nicht komplizierter als das mit einer Python-Quelltextdatei zu tun. Falls es nur sehr einfach Schlüssel/Wert-Paare sein sollen, käme auch noch der `ConfigParser` aus der Standardbibliothek in Frage. Oder `ConfigObj` als externe Lösung wenn man etwas umfangreichere Möglichkeiten von dem INI-Format erwartet.

Falls es Python-Quelltext sein soll/muss, dann würde ich das so einfach wie möglich halten und einfach direkt ein importierbares Modul schreiben. Eben eine `config.py`.
uwerothfeld
User
Beiträge: 17
Registriert: Freitag 24. Juni 2011, 14:18

danke :D
Antworten