Seite 1 von 1

Globale Variable über Modulgrenzen (vgl. "extern"

Verfasst: Montag 5. Mai 2008, 08:54
von CodeKamel
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'))

Verfasst: Montag 5. Mai 2008, 09:33
von shakebox
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.

Verfasst: Montag 5. Mai 2008, 09:42
von CodeKamel
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.

Verfasst: Montag 5. Mai 2008, 09:46
von Leonidas
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.

Verfasst: Montag 5. Mai 2008, 11:03
von 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.

Verfasst: Montag 5. Mai 2008, 11:34
von CodeKamel
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!

Verfasst: Montag 5. Mai 2008, 11:41
von Rebecca
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")