2017-01-05 1 views
0

Je crée une application de ligne de commande écrite en Python. Je voudrais utiliser les idées de profils, où chaque profil a des valeurs différentes à utiliser dans l'application.Variables dans le contexte de l'application pour l'application de ligne de commande

Je parviens à créer un fichier properties.ini et à créer un fichier config_parser.py qui contient une fonction qui reçoit les profils et charge les propriétés dans certaines variables. Ensuite, je l'importe dans tous les fichiers dont j'ai besoin pour les utiliser.

Je voudrais passer le profil en tant qu'argument lorsque j'exécute l'application, charger les bonnes propriétés et les mettre dans le contexte de l'application entière, en évitant import config_parser partout.

Par exemple, dans mon properties.ini je:

[DEFAULT] 
[email protected] 

[e2e_testing] 
[email protected] 

Dans le config_parser.py j'ai:

import configparser 

config = configparser.ConfigParser() 
config.read('properties.ini') 

GLOBAL_EMAIL = '' 

def load_config(profile): 
    global GLOBAL_EMAIL 

    GLOBAL_EMAIL = config[profile]['GLOBAL_EMAIL'] 

Et pour chaque script que je besoin d'utiliser les propriétés que je fais:

from application import config_parser as CFG 

def method(profile): 
    CFG.load_config(profile) 
    print CFG.GLOBAL_EMAIL 

Idéalement, j'aimerais que cette configuration soit chargée pendant l'exécution de main.py (qui est le point d'entrée de mon application), puis partagé à travers les modules à l'intérieur de ce paquet, donc je n'ai pas besoin d'importer le config_parser partout ni de passer la variable profile.

Je l'ai lu et __builtin__ pensé à faire le config_parser ajouter les variables dans le __builtin__ (ils seront disponibles pour tous les modules de ce package), mais je ne suis pas sûr de savoir comment tester l'unité avec le Pytest depuis __builtin__ sera être disponible uniquement pour les modules dans le dossier source et je vais devoir me moquer d'une manière ou d'une autre.

Merci d'avance!

+0

Pourquoi ne pas analyser la configuration une fois dans main.py et transmettre le résultat à tous vos modules? – ThisSuitIsBlackNot

Répondre

0

Avez-vous l'intention d'exécuter un profil dans un processus (ou un groupe de processus?). Si oui, vous pouvez utiliser les variables d'environnement:

# main.py 
import os 
def load_config(): 
    os.environ["GLOBAL_EMAIL"] = config[profile]['GLOBAL_EMAIL'] 

# module.py 
def modfunc(): 
    email = os.environ["GLOBAL_EMAIL"]