展开环境变量:ox.exexpandvars()只在Json dict中工作而不在字符串中



我有一个.env文件,内容如下:

SOME_PATH_VARIABLE = PATH_TO_FOLDER

我想读入一个嵌套的Json文件(日志文件配置(,并通过os.path.expandvars()展开SOME_PATH_VARIABLE

Json文件大致如下:

{
"version": 1,
"disable_existing_loggers": false,
"formatters": {
"std_formatter": {
....
},
"MY_Custom_formatter": {
......
}
},
"handlers": {
"console": {
....
},
"MY_CUSTOM_HANDLER": {
"class": "logging.handlers.TimedRotatingFileHandler",
"when": "midnight",
"level": "DEBUG",
"formatter": "MY_Custom_formatter",
"filename": "${SOME_PATH_VARIABLE}/DailyLog.log",
"encoding": "UTF-8"
}
},
"loggers": {
...
}
}
}

现在:

import os.path
from string import Template
from dotenv import find_dotenv, load_dotenv
load_dotenv(find_dotenv())
with open(PATH_TO_JSON_FILE, encoding="utf-8") as c_file:
# expanding .env content
# This works und windows (ie. load as dict )
j_dict = json.loads(c_file.read())
j_dict['handlers']['MY_CUSTOM_HANDLER']['filename'] = os.path.expandvars(j_dict['handlers']['MY_CUSTOM_HANDLER']['filename'])
# This also works
j_string = Template(c_file.read()).substitute(os.environ)
# This used to work under Linux/ OSX (i.e. expand the json string)
# But i doesnt work anymore und windows ( if that is the problem)
# The string is returned without expanded enviroment variables.
j_string= os.path.expandvars(c_file.read())

我不明白小写是怎么回事?占位符是否设置为var的文字值?我读到用转义的引号扩展JSON字符串可能会有问题。但事实并非如此?

任何帮助都将不胜感激。

提前感谢

根据文档:

在3.6版中更改:接受类似路径的对象。

所以我猜您更新到了python 3.6或更高版本,JSON字符串不适用于expandvars(),因为它不是一个类似路径的对象。

另一方面,来自j_dict['handlers']['MY_CUSTOM_HANDLER']['filename']的字符串值是一个类似路径的对象,因此当您将expandvars()从python dict中提取出来时,它可以很好地工作

最新更新