Applications require initialization before we can use them. This is true for most applications that we use everyday, from desktop, mobile to web applications. There are several ways to initialize applications. This guide focuses on the most common methods that we can use when writing Python applications.
Python variables
Perhaps the most common way to save configurations is to write in Python modules. The configurations are commonly stored on variables and imported when needed. For example, if we have a module named config.py
.
#!/usr/bin/env python
HOST = 'mydomain.com'
PORT = 8080
USERNAME = 'username'
PASSWORD = 'password'
We can import these variables to initialize our application. For instance, logging in to a server, before using an app.
#!/usr/bin/env python
from config import HOST, PORT, USERNAME, PASSWORD
login(host=HOST, port=PORT, username=USERNAME, password=PASSWORD)
# next steps here
Environment variables
Another popular method of configuring applications is by accessing environment variables. We can do this in Python using the os
standard library.
#!/usr/bin/env python
import os
login(host=os.getenv('HOST'), port=os.getenv('PORT'),
username=os.getenv('USERNAME'), password=os.getenv('PASSWORD'))
# next steps here
.env files
This is similar to the previous method, however, the variables written in .env
file and are loaded only at run time. The .env
file should contain the following:
HOST=mydomain.com
PORT=8080
USERNAME=username
PASSWORD=password
A popular library for loading a .env
file is by using python-dotenv. The first step is to install it using pip
.
pip install python-dotenv
To use python-dotenv, simply call load_dotenv() and use os standard library.
#!/usr/bin/env python
import os
from dotenv import load_dotenv
load_dotenv()
login(host=os.getenv('HOST'), port=os.getenv('PORT'), username=os.getenv('USERNAME'),
password=os.getenv('PASSWORD'))
# next steps here
Note: If you are using pipenv, there is no need to explicitly load a .env
file as pipenv
will automatically load this file. Just use the os
standard library.
.ini and .cfg files
INI
and CFG
files are some of the oldest methods of storing configuration. Even the production-tested applications are still using this type of configuration. One advantage of INI
files is the support for sections. For example, the format below groups the variables to the section CREDENTIALS
.
[CREDENTIALS]
HOST: mydomain.com
PORT: 8080
USERNAME: username
PASSWORD: password
These files can be read using the Python standard library, configparser.
#!/usr/bin/env python
import configparser
config = configparser.ConfigParser()
config.read('config.ini')
credentials = config['CREDENTIALS']
login(host=credentials['HOST'], port=credentials['PORT'], username=credentials['USERNAME'],
password=credentials['PASSWORD'])
# next steps here
YAML files
Because YAML format supports a lot of structures, it is commonly used by most modern applications. The advantage of YAML files is that, unlike other plain text formats, it is not limited to just variables or sections but it has support for lists or maps, and the depth does not have a limit. This example is a simple representation of YAML.
CREDENTIALS:
HOST: mydomain.com
PORT: 8080
USERNAME: username
PASSWORD: password
PyYAML is the most complete YAML parser implementation for Python. To install PyYAML, simply use pip
.
pip install pyyaml
The example below loads a YAML file.
#!/usr/bin/env python
import yaml
with open('config.yml') as f:
configurations = yaml.safe_load(f.read())
credentials = configurations['CREDENTIALS']
login(host=credentials['HOST'], port=credentials['PORT'], username=credentials['USERNAME'],
password=credentials['PASSWORD'])
Conclusion
Depending on the use cases, we can choose which configuration format we can use. Take note that this list only cover the most common and simplest methods. There are also other configuration formats available like JSON, Windows Registry, etc.