ConfigParser 和带有环境变量的字符串插值

新手上路,请多包涵

我有点不熟悉 python 语法,而且我在读取带有插值的 .ini 文件时遇到问题。

这是我的 ini 文件:

 [DEFAULT]
home=$HOME
test_home=$home

[test]
test_1=$test_home/foo.csv
test_2=$test_home/bar.csv

那些线

from ConfigParser import SafeConfigParser

parser = SafeConfigParser()
parser.read('config.ini')

print parser.get('test', 'test_1')

做输出

$test_home/foo.csv

在我期待的时候

/Users/nkint/foo.csv

编辑:

我认为 $ 语法隐式包含在所谓的 字符串插值 中(参考 手册):

在核心功能之上,SafeConfigParser 支持插值。这意味着值可以包含引用同一部分中其他值的格式字符串,或特殊 DEFAULT 部分中的值。

但我错了。如何处理这种情况?

原文由 nkint 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 516
2 个回答

首先,根据文档,您应该使用 %(test_home)s 进行插值 test_home 。此外,密钥不区分大小写,您不能同时使用 HOMEhome 密钥。最后,您可以使用 SafeConfigParser(os.environ) 来考虑您的环境。

 from ConfigParser import SafeConfigParser
import os

parser = SafeConfigParser(os.environ)
parser.read('config.ini')

其中 config.ini

[DEFAULT]
test_home=%(HOME)s

[test]
test_1=%(test_home)s/foo.csv
test_2=%(test_home)s/bar.csv

原文由 Michele d‘Amico 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以在 Python 3 的情况下编写自定义插值:

 import configparser
import os

class EnvInterpolation(configparser.BasicInterpolation):
    """Interpolation which expands environment variables in values."""

    def before_get(self, parser, section, option, value, defaults):
        value = super().before_get(parser, section, option, value, defaults)
        return os.path.expandvars(value)

cfg = """
[section1]
key = value
my_path = $PATH
"""

config = configparser.ConfigParser(interpolation=EnvInterpolation())
config.read_string(cfg)
print(config['section1']['my_path'])

原文由 Alex Markov 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题