【问题标题】:Config for multiple environments wth configparser使用 configparser 为多个环境配置
【发布时间】:2021-05-08 13:58:27
【问题描述】:

这可能是一个很长的问题,但请耐心等待。

我经常创建小型自动化程序,在开发环境中进行测试,然后推广到生产环境中工作。我使用配置文件来存储我的所有配置,到目前为止它对我来说效果很好,但让它更难使用的一件事是根据环境切换值。

我过去曾使用过类似以下结构的东西,但一直想知道是否有更好的方法来维护配置文件。

[Global]
.
.
Environment = Dev

[SpecificSection-Dev]
key1 = dev value1
key2 = dev value2
keyn = dev valuen


[SpecificSection-Prod]
key1 = prod value1
key2 = prod value2
keyn = prod valuen

然后我会读取配置文件并使用环境来决定选择什么,如下所示:

parser.get('SpecificSection-' + parser.get('Global','Environment'), 'key1')

在我以前的代码版本中,我已经注释掉了其他环境的值,并且我手动注释和取消了手头任务所需的值。

我的问题很简单,有没有更好的方法呢?理想情况下,我想在配置文件中定义一次环境,而不必像我一样在代码中明确处理它。

谢谢, 卡兰

【问题讨论】:

    标签: python python-3.x configuration


    【解决方案1】:

    我对 Python 不是很熟悉,所以我将使用类似 Java 的伪代码,而不是尝试在这个答案中编写 Python 代码。我建议您编写一个类,为原始 parser 对象提供包装器。包装类的get() 操作的实现可以委托给parser 对象,就像您在问题中显示的那样。所以,这看起来像(伪代码):

    class ParserWrapper {
      Parser   parser;
      String   env;
    
      ParserWrapper(String file) {
        parser = new Parser(file);
        env = parser.get("Global", "Environment");
      }
    
      String get(String name) {
        return parser.get("SpecificSection-" + env, name)
      }
    }
    

    【讨论】:

    • 感谢您的建议,但我希望有一种使用 configparser 本身的方法。我以为这将是一个常见问题,但也许不是。
    • @KaranpreetSingh 我认为这很常见,但我不认为这是一个“问题”,因为它很容易处理(例如,使用我提供的伪代码)。另一种方法是为每个环境使用单独的配置文件,在这种情况下,不需要将“Dev”或“Prod”嵌入到部分名称中。如果配置文件包含敏感信息(例如数据库凭据),则 Dev 和 Prod 的单独配置文件也是一个好主意,因为将 Prod 凭据暴露给开发人员可能会带来安全风险。
    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多