Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Python environment configuration simplified - highly inspired by `node-config`.

License

NotificationsYou must be signed in to change notification settings

grimen/python-config2

Repository files navigation

Python environment configuration simplified.

Introduction

Config2 (for Python) - which is highly inspired bynode-config - organizes hierarchical configurations for your app deployments.

It lets you define a set of default parameters, and extend them for different deployment environments (development, qa, staging, production, etc.).

Configurations are stored inconfiguration files within your application, and can be overridden and extended byenvironment variables,command line parameters, orexternal sources.

This gives your application a consistent configuration interface shared among a growing list of npm modules also using node-config.

NOTE: This project is more or less in pair withnode-config implementation, with exception for some fluff that could be considered too much magic such as deployment specificmulti-instance deployments which I so far haven't found any good motivation for, and some other questionable advanced features mentioned in the wiki pages.

Project Guidelines

...based onnode-config project guidelines:

  • Simple - Get started fast
  • Powerful - For multi-node enterprise deployment - excluded becausewith power comes responsability
  • Flexible - Supporting multiple config file formats
  • Lightweight - Small file and memory footprint
  • Predictable - Well tested foundation for module and app developers

Install

Install usingpip:

$ pip install config2

Use

1. Assuming we have apython application project...

some_project└── app.py

app.py - some app making serious$$$

# business logicprint('$$$')

2. Let's add some environment specificconfig files...

some_project└── config    ├── default.yml    ├── development.yml    ├── foo.yml    └── production.yml└── app.py

default.yml - with some bogus nested settings shared for all environments (defaults)

a1:DEFAULT 1a2:b1:[1, 2, 3]b2:        -foo        -barb3:c1:1c2:"DEFAULT 2"

development.yml - with some bogus nested settings overriden fordevelopment environment (overriden)

a2:b2:        -DEV 1b3:c2:"DEV 2"some_key_only_for_dev:true

foo.yml - with some bogus nested settings overriden forfoo environment (overriden)

a2:b2:        -FOO 1b3:c2:"FOO 2"some_key_only_for_foo:true

production.yml - with some bogus nested settings overriden forproduction environment (overriden)

a2:b2:        -PROD 1b3:c2:"PROD 2"some_key_only_for_prod:true

3. Let's nowrun the app usingvarious environments...

$ python app.py

fromconfig2.configimportconfigconfig.get_env()# => Noneconfig.get()# => {'a1': 'DEFAULT 1', 'a2': {'b1': [1, 2, 3], 'b2': ['foo', 'bar'], 'b3': {'c1': 1, 'c2': 'DEFAULT 2'}}}config.a1# => 'DEFAULT 1'config.a2# => {'b1': [1, 2, 3], 'b2': ['foo', 'bar'], 'b3': {'c1': 1, 'c2': 'DEFAULT 2'}}config.a2.b3.c2# => 'DEFAULT 2'print('$$$')

$ ENV=development python app.py

fromconfig2.configimportconfigconfig.get_env()# => 'development'config.get()# => {'a1': 'DEFAULT 1', 'a2': {'b1': [1, 2, 3], 'b2': ['DEV 1'], 'b3': {'c1': 1, 'c2': 'DEV 2'}}, 'some_key_only_for_dev': True}config.a1# => 'DEFAULT 1'config.a2# => {'b1': [1, 2, 3], 'b2': ['DEV 1'], 'b3': {'c1': 1, 'c2': 'DEV 2'}}config.a2.b3.c2# => 'DEV was here 2'config.some_key_only_for_dev# => Trueconfig.some_key_only_for_foo# => AttributeErrorconfig.some_key_only_for_prod# => AttributeErrorprint('$$$')

$ ENV=foo python app.py

fromconfig2.configimportconfigconfig.get_env()# => 'foo'config.get()# => {'a1': 'DEFAULT 1', 'a2': {'b1': [1, 2, 3], 'b2': ['FOO 1'], 'b3': {'c1': 1, 'c2': 'FOO 2'}}, 'some_key_only_for_foo': True}config.a1# => 'DEFAULT 1'config.a2# => {'b1': [1, 2, 3], 'b2': ['FOO 1'], 'b3': {'c1': 1, 'c2': 'FOO 2'}}config.a2.b3.c2# => 'FOO was here 2'config.key_only_for_foo# => Trueconfig.some_key_only_for_dev# => AttributeErrorconfig.some_key_only_for_prod# => AttributeErrorprint('$$$')

$ ENV=production python app.py

fromconfig2.configimportconfigconfig.get_env()# => 'production'config.get()# => {'a1': 'DEFAULT 1', 'a2': {'b1': [1, 2, 3], 'b2': ['PROD 1'], 'b3': {'c1': 1, 'c2': 'PROD 2'}}, 'some_key_only_for_foo': True}config.a1# => 'DEFAULT 1'config.a2# => {'b1': [1, 2, 3], 'b2': ['PROD 1'], 'b3': {'c1': 1, 'c2': 'PROD 2'}}config.a2.b3.c2# => 'PROD was here 2'config.some_key_only_for_prod# => Trueconfig.some_key_only_for_dev# => AttributeErrorconfig.some_key_only_for_foo# => AttributeErrorprint('$$$')

etc.

4. Optionally, let's now introduce customconfig environment variables...

some_project└── config    ├── custom-environment-variables.yml    ├── default.yml    ├── development.yml    ├── foo.yml    └── production.yml└── app.py

custom-environment-variables.yml - with mappings of config keys to environment variables

a1:A1a2:b3:c2:C2

5. Let's nowrun the app usingcustom environment variables to override config...

$ A1=x C2=y python app.py

fromconfig2.configimportconfigconfig.get_env()# => Noneconfig.get()# => {'a1': 'x', 'a2': {'b1': [1, 2, 3], 'b2': ['foo', 'bar'], 'b3': {'c1': 1, 'c2': 'y'}}}config.a1# => 'x'config.a2# => {'b1': [1, 2, 3], 'b2': ['foo', 'bar'], 'b3': {'c1': 1, 'c2': 'y'}}config.a2.b3.c2# => 'y'print('$$$')

Test

Clone down source code:

$ make install

Runcolorful tests, with only native environment (dependency sandboxing up to you):

$ maketest

Runless colorful tests, withmulti-environment (usingtox):

$ make test-tox

About

This project was mainly initiated - in lack of existing alternatives - to be used at our work atMarkable.ai to have common code conventions between various programming environments wherePython (research, CV, AI) andNode.js (I/O, APIs, UIs, scripts) currently are most used.

License

Released under the MIT license.

About

Python environment configuration simplified - highly inspired by `node-config`.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

[8]ページ先頭

©2009-2025 Movatter.jp