我有一个需要根据环境变量的值使用不同配置的Python项目。由于使用环境变量选择配置文件已经足够简单,所以我的问题是:
在Python中,当需要基于环境使用多个配置时,哪种格式被视为软件行业最佳实践来设置配置文件?
我知道Python带有ConfigParser模块,但我想知道是否最好使用像YAML或JSON这样的格式,因为它们由于易于跨语言使用而变得越来越流行。当你有多个配置需要维护时,哪种格式更容易维护?
我有一个需要根据环境变量的值使用不同配置的Python项目。由于使用环境变量选择配置文件已经足够简单,所以我的问题是:
在Python中,当需要基于环境使用多个配置时,哪种格式被视为软件行业最佳实践来设置配置文件?
我知道Python带有ConfigParser模块,但我想知道是否最好使用像YAML或JSON这样的格式,因为它们由于易于跨语言使用而变得越来越流行。当你有多个配置需要维护时,哪种格式更容易维护?
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)
|--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
EnvironmentError
自Python 3.3起已被弃用。在这里可能更适合使用ValueError
。 - user22472937enum
来代替手动引发错误来表示config_space
的值。 - user22472937我认为查看Python Django设置模块的标准配置是一个很好的例子,因为Python Django Web框架非常受商业项目欢迎,因此代表着软件行业。
它不会使用太过高级的JSON或YAML配置文件 - 它只是使用一个名为settings.py的Python模块,可以导入到需要访问该设置的任何其他模块中。同时也在其中定义了基于环境变量的设置。以下是Django在Github上的示例settings.py文件链接:
https://github.com/deis/example-python-django/blob/master/helloworld/settings.py
我也喜欢利用Python源代码无需编译,可以使用纯Python文件进行配置的优势。但在现实世界中,您可能有多个环境,每个环境都需要不同的配置,并且您可能还想从环境变量或未在源代码控制中的文件中读取一些(主要是敏感)信息(以防止错误提交这些信息)。
这就是我写这个库的原因:https://github.com/davidohana/kofiko,它允许您使用纯Python文件进行配置,但也能够从.ini或env-vars覆盖这些配置设置,并支持不同环境的自定义。
关于此的博客文章:https://medium.com/swlh/code-first-configuration-approach-for-python-f975469433b9