我之前已经问过这个问题(What's the best practice using a settings file in Python?),但是看到7年前这个问题,我觉得再次讨论技术如何演变是有效的。
我有一个python项目,需要根据环境变量的值使用不同的配置。由于使用环境变量来选择配置文件很简单,我的问题如下:
当根据环境需要多个配置时,哪种格式被视为软件行业中在python中设置配置文件的最佳做法?
我意识到python附带了一个ConfigParser模块,但我想知道使用YAML或JSON这样的格式是否更好,因为它们因跨语言的易用性而受欢迎。当您有多个配置时,哪种格式更容易维护?
答案 0 :(得分:1)
我认为查看Python Django设置模块的标准配置就是一个很好的例子,因为Python Django Web框架在商业项目中非常流行,因此代表了软件行业。
使用JSON或YAML配置文件并不太花哨 - 它只是使用名为settings.py的python模块,可以导入到需要访问设置的任何其他模块中。基于环境变量的设置也在那里定义。这是一个链接到Github上Django的示例settings.py文件:
https://github.com/deis/example-python-django/blob/master/helloworld/settings.py
答案 1 :(得分:1)
如果你真的想使用基于环境的YAML配置,你可以这样做:
import yaml
import os
config = None
filename = 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)
答案 2 :(得分:0)
这实际上取决于您的要求,而不是格式的受欢迎程度。例如,如果您只需要简单的键值对,那么INI文件就足够了。一旦你需要复杂的结构(例如,数组或字典),我就会选择JSON或YAML。 JSON只是存储数据(它更适用于系统之间的自动数据流),而YAML更适合人工生成(或维护或读取)文件,因为它有注释,你可以在文件的其他地方引用值......最重要的是,如果你想要健壮性,灵活性和手段来检查文件的正确结构(但不关心数据的手动版本),我会选择XML。
答案 3 :(得分:0)
这真的很晚,但是这是我使用的,我对此感到满意(如果您愿意使用纯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
答案 4 :(得分:0)
我还想利用一个事实,即您不必编译Python源代码,也不必使用普通的Python文件进行配置。但是在现实世界中,您可能有多个环境,每个环境都需要不同的配置,并且您可能还希望从环境变量或不在源代码控制中的文件中读取一些(最敏感的)信息(以防止错误提交)。
这就是为什么我写了这个库:https://github.com/davidohana/kofiko, 不仅可以使用普通的Python文件进行配置,而且还可以覆盖.ini或env-vars中的那些配置设置,并且还支持针对不同环境的自定义。
有关它的博客文章:https://medium.com/swlh/code-first-configuration-approach-for-python-f975469433b9