python - 如何在 Python 3 中使用 pyhocon 动态生成 Hocon conf 文件?

标签 python python-3.x hocon

我想使用自动化来创建带有 python 3 脚本的 hocon 配置。我读到 lightbend ( https://github.com/lightbend/config ) 推荐 pyhocon ( https://github.com/chimpler/pyhocon )。

我在弄清楚如何创建 Hocon 对象并将数据作为 hocon 写入文件时遇到问题。替换的语法在结果中对我来说很重要。

例如,我希望文件 myconfig.conf 的输出看起来像这样:

{
   Environment: "dev"
   JobName: ${Environment}"-hello-bob"
}

所以,我假设有一种方法可以做这样的事情:
config2 = ConfigFactory.parse_string("{}")
config2.put("Environment", "dev")
#Some type of object for references or special syntax for ${Environment}  
config2.put("JobName", "${Environment}")

然后在创建填充对象后,应该有一种简单的方法来写出一个或多个文件:
filename = "myconfig.conf"
print("Write to disk as {}".format(filename))
with open(filename, "w") as fd:
    fd.write(config2.to_hocon_str)

有没有人想出办法做到这一点?该库只能用于读取数据,这似乎很奇怪。

最佳答案

因此,我决定查看 JVM (Java/Scala) 库 ( https://github.com/lightbend/config ) 的文档。阅读文档后,有一个关于 hocon 示例的清晰部分( https://github.com/lightbend/config#examples-of-hocon )。在本文档中,他们对 7 种有效的 hocon 样式进行了分类。我称这些样式是因为如果我要自动生成这些文件,我会选择一种写出并坚持使用的方法。

所有这些都是有效的 HOCON。

1.从有效的JSON开始:

{
    "foo" : {
        "bar" : 10,
        "baz" : 12
    }
}

2.Drop根括号:
"foo" : {
    "bar" : 10,
    "baz" : 12
}

3.Drop 报价:
foo : {
    bar : 10,
    baz : 12
}

4.使用=并在{之前省略它:
foo {
    bar = 10,
    baz = 12
}

5.去掉逗号:
foo {
    bar = 10
    baz = 12
}

6.对不带引号的键使用点号:
foo.bar=10
foo.baz=12

7.将点分字段放在一行上:
foo.bar=10, foo.baz=12

因为我将使用 pyhocon 库,所以我需要在库中寻找编写解决方案。我从 chimpler 的 git ( https://github.com/chimpler/pyhocon ) 中找到了一些帮助。我发现它们有两种可以简单写出的 hocon 样式。一个是 json,另一个是不在上面由 lightbend 描述的列表中的东西。

样式一:纯JSON,witch可以用两种方式写出来:

HOCONConverter.to_json
#Using HOCONConverter.to_json
confTree = ConfigFactory.parse_string("{}")
confTree.put("Environment","Dev")
confTree.put("Test","${Environment}")

filename = "./json_coverted.conf"
print("Write to disk as {}".format(filename))
with open(filename, "w") as fd:
    fd.write(HOCONConverter.to_json(confTree))

HOCONConverter.to_json 结果
{
    "Environment": "Dev",
    "Test": "${Environment}"
}

或使用 json.dump
#Using json.dump
confTree = ConfigFactory.parse_string("{}")
confTree.put("Environment","Dev")
confTree.put("Test","${Environment}")
filename = "./json_dumped.conf"
print("Write to disk as {}".format(filename))
with open(filename, "w") as fd:
    fd.write(json.dumps(confTree,indent=4))

使用 json.dump 结果
{
  "Environment": "Dev",
  "Test": "${Environment}"
}

Pyhocon 的其他 Style,未由 lightbend 列出
# HOCONConverter.to_hocon
confTree = ConfigFactory.parse_string("{}")
confTree.put("Environment","Dev")
confTree.put("Test","${Environment}")
filename = "./hocon_coverted.txt"
print("Write to disk as {}".format(filename))
with open(filename, "w") as fd:
    fd.write(HOCONConverter.to_hocon(confTree))

Pyhocon 的其他 Style,未按 lightbend 结果列出
Environment = "Dev"
Test = "${Environment}"

因此,要回答我自己的问题,在 Python 3 中使用 pyhocon 动态生成 hocon conf 文件的唯一可靠方法是使用其中一种 json 方法(转换器或转储)。但这仍然是一个悬而未决的问题。问题是,将 json 读取到 pyhocon ConfTree 对象是否能够在 json 中取消引用替换?

例如,如果我阅读文件
{
    "Environment": "Dev",
    "Test": "${Environment}"
}

ConfTree 对象会得到“Dev”作为 Test 的值吗?
不,不会。这是我的测试
filename = "json_coverted.conf"
print("Reading file{}".format(filename))
conf = ConfigFactory.parse_file(filename)
key="Test"
value=conf.get(key)
print("Key:{} Value:{}".format(key,value))

测试结果输出到屏幕
Reading filejson_coverted.conf
Key:Test Value:${Environment}

那么,那么如何使用 pyhocon 进行替换呢?

关于python - 如何在 Python 3 中使用 pyhocon 动态生成 Hocon conf 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59417529/

相关文章:

python - 如何将 "game"(PyGame 或 Tk)录制到视频中?

sql-server - 将keras模型保存到数据库

python - 从 Pandas 到字典,第一列中的值将是键,第二列中的相应值将全部在列表中

python - 在 C++ 中的 PyObject 上调用 `+=`

python - 求减IPSet

gradle shadowJar 结合 HOCON 格式的配置文件

json - 类似于 NodeJS 的 Typesafe Config

python - python 文件中的代码在导入时何时运行?

python - Falcon 过早关闭连接