2017-01-05 6 views
0

私はPythonで書かれたコマンドラインアプリケーションを構築しています。私はプロファイルのアイデアを使用したいと思います。各プロファイルには、アプリケーションで使用するいくつかの異なる値があります。コマンドラインアプリケーションのアプリケーションコンテキスト内の変数

properties.iniファイルを作成し、プロファイルを受信して​​一部の変数にプロパティを読み込む1つの機能を含むファイルを作成します(config_parser.py)。それから私はそれらを使用するために必要なすべてのファイルでこれをインポートします。

アプリケーションを実行するときにプロファイルを渡して、適切なプロパティをロードしてアプリケーション全体のコンテキストに入れて、どこでもimport config_parserを避けてください。例えば

、私properties.iniに私が持っている:私が持っているconfig_parser.py

[DEFAULT] 
[email protected] 

[e2e_testing] 
[email protected] 

を:

import configparser 

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

GLOBAL_EMAIL = '' 

def load_config(profile): 
    global GLOBAL_EMAIL 

    GLOBAL_EMAIL = config[profile]['GLOBAL_EMAIL'] 

そして、私は私が行うプロパティを使用する必要があるすべてのスクリプトのために:

from application import config_parser as CFG 

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

理想的には、この設定を実行中にロードしたいmain.py(これは私のアプリケーションのエントリーポイント)であり、そのパッケージ内でモジュール全体を共有しているので、config_parserをどこにでもインポートする必要はなく、profile変数を渡す必要もありません。

私はおよそ__builtin__と(そう、彼らはそのパッケージ内のすべてのモジュールで利用できるようになります)config_parser__builtin__内の変数を追加することについて考えを読んで、私はどのように__builtin__するのでPytestとのユニットテストをするかわかりませんソースフォルダ内のモジュールに対してのみ利用可能であり、私は何とかそれを模擬する必要があります。

ありがとうございます!

+0

configを一度解析して、すべてのモジュールに渡すのはなぜですか? – ThisSuitIsBlackNot

答えて

0

1つのプロセス(またはプロセスのグループ)で1つのプロファイルを実行する予定ですか?その場合は、環境変数を使用することができます:

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

# module.py 
def modfunc(): 
    email = os.environ["GLOBAL_EMAIL"] 
関連する問題