在pyhocon中可以在运行时包含文件

时间:2019-02-11 14:52:14

标签: python-3.x hocon

在pyhocon中可以在运行时包含文件吗?

例如,我知道如何在运行时合并树

function sendData (){

  var json = collectformData();

  var params = {
    "method": "POST",
    "contentType":"application/json",
    "payload": json,
  };

  var response = UrlFetchApp.fetch(URL_ENDPOINT, params);

  if (response.getResponseCode() == "200"){
    SpreadsheetApp.getUi().alert("Success!");
  };

  return response.getContentText();
}

我想模拟include语句,以便在运行时对hocon变量进行求值,如下面的希望代码所示:

conf = ConfigFactory.parse_file(conf_file)
conf1 = ConfigFactory.parse_file(include_conf)
conf = ConfigTree.merge_configs(conf, conf1)

1 个答案:

答案 0 :(得分:0)

可以使用字符串:

from pyhocon import ConfigFactory

# readingconf entrypoint
file = open('application.conf', mode='r')
conf_string = file.read()
file.close()

conf_string_ready = conf_string.replace("PATH_TO_CONFIG","spec.conf")
conf = ConfigFactory.parse_string(conf_string_ready)

print(conf)

application.conf具有

include "file://INCLUDE_FILE"

或者在没有准备的运行时中,我自己使用python 3.65编写了它:

#!/usr/bin/env python

import os
from pyhocon import ConfigFactory as Cf


def is_line_in_file(full_path, line):

    with open(full_path) as f:
        content = f.readlines()

        for l in content:
            if line in l:
               f.close()
               return True

        return False


 def line_prepender(filename, line, once=True):

    with open(filename, 'r+') as f:
        content = f.read()
        f.seek(0, 0)

        if is_line_in_file(filename, line) and once:
             return

        f.write(line.rstrip('\r\n') + '\n' + content)


 def include_configs(base_path, included_paths):

     for included_path in included_paths:

         line_prepender(filename=base_path, line=f'include file("{included_path}")')

     return Cf.parse_file(base_path)


if __name__ == "__main__":

    dir_path = os.path.dirname(os.path.realpath(__file__))
    print(f"current working dir: {dir_path}")

    dir_path = ''

    _base_path = f'{dir_path}example.conf'
    _included_files = [f'{dir_path}example1.conf', f'{dir_path}example2.conf']

    _conf = include_configs(base_path=_base_path, included_paths=_included_files)

    print('break point')