命令行应用程序的应用程序上下文中的变量

时间:2017-01-05 21:03:35

标签: python python-2.7 configuration-files pytest

我正在构建一个用Python编写的命令行应用程序。我想使用配置文件的想法,其中每个配置文件都有一些不同的值用于应用程序。

我设法创建一个properties.ini文件并创建一个config_parser.py文件,其中包含一个接收配置文件并将属性加载到某些变量中的函数。然后我将其导入到我需要使用的每个文件中。

我想在执行应用程序时将配置文件作为参数传递,加载正确的属性并将它们放在整个应用程序的上下文中,避免在任何地方使用import config_parser

例如,在我的properties.ini我有:

[DEFAULT]
 GLOBAL_EMAIL=example@email.com

[e2e_testing]
 GLOBAL_EMAIL=another_email@email.com

config_parser.py我有:

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__中添加变量(因此它们可用于该软件包中的所有模块),但我'我不确定如何使用Pytest进行单元测试,因为__builtin__只能用于源文件夹中的模块,我需要以某种方式模拟它。

提前致谢!

1 个答案:

答案 0 :(得分:0)

您是否计划在一个流程(或一组流程?)中运行一个配置文件。如果是这样,您可以使用环境变量:

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

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