json 在Python中设置配置文件的最佳方法是什么

w6mmgewl  于 2023-04-22  发布在  Python
关注(0)|答案(6)|浏览(178)

我意识到这个问题以前被问过(What's the best practice using a settings file in Python?),但鉴于这个问题是7年前问的,我觉得再次讨论技术是如何发展的是有效的。
我有一个python项目,需要根据环境变量的值使用不同的配置。由于使用环境变量选择配置文件非常简单,我的问题如下:

当需要根据环境进行多个配置时,在软件行业中,在python中设置配置文件的最佳做法是什么格式?

我知道python自带了ConfigParser模块,但我想知道是否使用YAML或JSON等格式更好,因为它们易于跨语言使用,因此受欢迎程度提高。当您有多个配置时,哪种格式更容易维护?

7d7tgy0s

7d7tgy0s1#

如果你真的想使用基于环境的YAML配置,你可以这样做:

config.py

import yaml
import os

config = None

filename = os.getenv('env', 'default').lower()
script_dir = os.path.dirname(__file__)
abs_file_path = os.path.join(script_dir, filename)
with open(abs_file_path, 'r') as stream:
    try:
        config = yaml.load(stream)
    except yaml.YAMLError as exc:
        print(exc)
mrphzbgm

mrphzbgm2#

我认为Python Django设置模块的标准配置是一个很好的例子,因为Python Django Web框架在商业项目中非常受欢迎,因此代表了软件行业。
它并没有使用JSON或YAML配置文件-它只是使用了一个名为www.example.com的Python模块settings.py,该模块可以导入到任何需要访问设置的其他模块中。基于环境变量的设置也在那里定义。这里是Github上Django的示例settings.py文件的链接:
https://github.com/deis/example-python-django/blob/master/helloworld/settings.py

e1xvtsh3

e1xvtsh33#

这对于聚会来说真的很晚,但这是我使用的,我很高兴它(如果你对纯Python解决方案持开放态度)。我喜欢它,因为我的配置可以根据使用环境变量部署的位置自动设置。我没有使用这个很长时间,所以如果有人看到问题,我会洗耳恭听。
结构:

|--settings
   |--__init__.py
   |--config.py

config.py

class Common(object):
    XYZ_API_KEY = 'AJSKDF234328942FJKDJ32'
    XYZ_API_SECRET = 'KDJFKJ234df234fFW3424@#ewrFEWF'

class Local(Common):
    DB_URI = 'local/db/uri'
    DEBUG = True

class Production(Common):
    DB_URI = 'remote/db/uri'
    DEBUG = False

class Staging(Production):
    DEBUG = True

init.py

from settings.config import Local, Production, Staging
import os

config_space = os.getenv('CONFIG_SPACE', None)
if config_space:
    if config_space == 'LOCAL':
        auto_config = Local
    elif config_space == 'STAGING':
        auto_config = Staging
    elif config_space == 'PRODUCTION':
        auto_config = Production
    else:
        auto_config = None
        raise EnvironmentError(f'CONFIG_SPACE is unexpected value: {config_space}')
else:
    raise EnvironmentError('CONFIG_SPACE environment variable is not set!')

如果我的环境变量在我的应用存在的每个地方都被设置,我可以根据需要将其带入我的模块:

from settings import auto_config as cfg
xesrikrc

xesrikrc4#

这实际上取决于您的需求,而不是格式的流行程度。例如,如果您只需要简单的键-值对,一个INI文件就足够了。(例如数组或字典),我会选择JSON或YAML。JSON只是存储数据(它更适合系统之间的自动数据流),而YAML更适合人类生成的(或维护,或读取)文件,因为它有注解,你可以在文件的其他地方引用值...而且最重要的是,如果你想要健壮性,灵活性,并检查文件结构是否正确(但不太关心数据的手动版本),我会选择XML。

nvbavucw

nvbavucw5#

我建议尝试使用trapdoor进行交钥匙配置(免责声明:我是《活板门》的作者)。

of1yzvn4

of1yzvn46#

我还想利用这样一个事实,即你不必编译Python源代码,也不必使用普通的Python文件进行配置。但在真实的世界中,你可能有多个环境,每个环境都需要不同的配置,你可能还想从环境变量或不在源代码控制中的文件中读取一些(大多数是敏感的)信息(以防止错误地提交这些信息)。
这就是我写这个库的原因:https://github.com/davidohana/kofiko,它允许您使用纯Python文件进行配置,但也能够覆盖.ini或env-vars中的配置设置,并且还支持针对不同环境的自定义。
关于它的博客文章:https://medium.com/swlh/code-first-configuration-approach-for-python-f975469433b9

相关问题