Globale Variable über Modulgrenzen (vgl. "extern"

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
CodeKamel
User
Beiträge: 4
Registriert: Montag 5. Mai 2008, 08:43

Hallo zusammen!

Seit kurzem darf/muss ich mich mit Python beschäftigen und trotz meines Addison Wesley Referenzbuches bleiben Fragen offen, die ich euch gern stellen möchte.

Ab Python 2.3 gibt es offenbar logging im Standard. Nun möchte ich für ein größeres Tools, welches aus verschiedenen .py Modulen besteht, eine zentrale Loggingdatei (FileHandler) verwenden. Dazu sollte die Instanz von logging, die über die Factorymethode getLogger geliefert wird, in jedem Modul verfügbar sein. Ich exportiere dazu den Namen des Loggers in eine Umgebungsvariable und hole den Inhalt der Umgebungsvariable in jedem Modul wieder ab, um mir jene Loggerinstanz aufbauen zu können, die im Hauptmodul definiert wurde.

Meine Frage: Kann man, ähnlich wie in C mit extern, globale Variablen in Modul A deklarieren, die man nicht nur in allen Funktionen innerhalb von A, sondern auch in Modulen B, C etc. verwenden kann? Ich vermute mal: Nein. Aber gibt es eine bessere Lösung als die o.g. mit Umweg über os.environ?


Beispiel A.py

Code: Alles auswählen

# setup logger (each module in the current python VM has access)
logger_config = ConfigDir + os.sep + Config['LoggerConfig']
logging.config.fileConfig(logger_config)
os.environ['LOGGER_NAME'] = Config['LoggerName']
In B.py

Code: Alles auswählen

logger = logging.getLogger(os.environ.get('LOGGER_NAME'))
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

hm, ich bin auch sehr neu in Python, aber auf die Idee mit ner Umgebungsvariable kaeme ich glaube ich nicht :) Warum uebergibst Du nicht einfach logging-Instanz als optionalen Parameter an die jeweiligen Funktionen der Module? Wenn sie gesetzt ist wird sie verwendet, wenn nicht wird halt nicht geloggt. Oder sowas in die Richtung.
CodeKamel
User
Beiträge: 4
Registriert: Montag 5. Mai 2008, 08:43

shakebox hat geschrieben:Warum uebergibst Du nicht einfach logging-Instanz als optionalen Parameter an die jeweiligen Funktionen der Module?
Hatte ich auch schon überlegt, aber ich möchte möglichst vermeiden, die bestehenden Methodensignaturen zu ändern.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo CodeKamel, willkommen im Forum,

Warum verwendest du niht einfach ``logging.info``, ``logging.debug``, ``logging.critical``, ``logging.error`` und ``logging.warning``. Die sind immer verfügbar wenn du ``logging`` importierst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@CodeKamel: Man kann für solche "globalen" Daten auch ein Modul verwenden. Zum Beispiel könntest Du Dein Logger-Setup in ein Modul `config` verlegen, und dann von allen anderen Modulen immer ein: ``import config`` machen und in den Funktionen über `config.logger` auf den Logger zugreifen.

Pfade würde ich übrigens mit `os.path.join()` zusammen setzen.
CodeKamel
User
Beiträge: 4
Registriert: Montag 5. Mai 2008, 08:43

Leonidas hat geschrieben: Warum verwendest du niht einfach ``logging.info``, ``logging.debug``, ``logging.critical``, ``logging.error`` und ``logging.warning``. Die sind immer verfügbar wenn du ``logging`` importierst.
Naja, ich möchte ja einen FileHandler verwenden, der in ein ganz bestimmtes File schreibt. Kann ich logging und seine Klassenmethoden denn entsprechend konfigurieren?
BlackJack hat geschrieben:@CodeKamel: Man kann für solche "globalen" Daten auch ein Modul verwenden. Zum Beispiel könntest Du Dein Logger-Setup in ein Modul `config` verlegen, und dann von allen anderen Modulen immer ein: ``import config`` machen und in den Funktionen über `config.logger` auf den Logger zugreifen.
Das ist eine gute Idee, so werde ich wohl vorgehen, vielen Dank.
BlackJack hat geschrieben: Pfade würde ich übrigens mit `os.path.join()` zusammen setzen.
Danke für den Hinweis!
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

CodeKamel hat geschrieben: Naja, ich möchte ja einen FileHandler verwenden, der in ein ganz bestimmtes File schreibt. Kann ich logging und seine Klassenmethoden denn entsprechend konfigurieren?

Code: Alles auswählen

logging.basicConfig(filename="spam.log")
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Antworten