Expand system variables Unix style
This module is inspired by GNU bash's variable expansion features. It can be used as an alternative to Python's os.path.expandvars function.
A good use case is reading config files with the flexibility of reading values from environment variables using advanced features like returning a default value if some variable is not defined. For example:
[default]
my_secret_access_code = "${ACCESS_CODE:-default_access_code}"
my_important_variable = "${IMPORTANT_VARIABLE:?}"
my_updated_path = "$PATH:$HOME/.bin"
my_process_id = "$$"
my_nested_variable = "${!NESTED}"NOTE: Although this module copies most of the common behaviours of bash, it doesn't follow bash strictly. For example, it doesn't work with arrays.
pip install expandvars
conda install -c conda-forge expandvars
from expandvars import expandvars
print(expandvars("$PATH:${HOME:?}/bin:${SOME_UNDEFINED_PATH:-/default/path}"))
# /bin:/sbin:/usr/bin:/usr/sbin:/home/you/bin:/default/pathFor now, refer to the test cases to see how it behaves.
If you want to enable strict parsing by default, (similar to set -u / set -o nounset in bash), pass nounset=True.
# All the variables must be defined.
expandvars("$VAR1:${VAR2}:$VAR3", nounset=True)
# Raises UnboundVariable error.NOTE: Another way is to use the
${VAR?}or${VAR:?}syntax. See the examples in tests.
If you want to temporarily disable strict parsing both for nounset=True and the ${VAR:?} syntax, set environment variable EXPANDVARS_RECOVER_NULL=somevalue.
This helps with certain use cases where you need to temporarily disable strict parsing of critical env vars, e.g. in testing environment, without modifying the code.
e.g.
EXPANDVARS_RECOVER_NULL=foo myapp --config production.ini && echo "All fine."WARNING: Try to avoid
export EXPANDVARS_RECOVER_NULLbecause that will disable strict parsing permanently until you log out.
You can customize the variable symbol, escape character, whether to expand non-surrounded variables and data used for the expansion by using the more general expand function.
from expandvars import expand
print(expand("%PATH:$HOME/bin:%{SOME_UNDEFINED_PATH:-D:\\default\\path}", environ={"PATH": "/example"}, var_symbol="%", surrounded_vars_only=True, escape_char=""))
# %PATH:$HOME/bin:D:\default\pathTo contribute, setup environment following way:
Then
# Clone repo
git clone https://github.com/sayanarijit/expandvars && cd expandvars
# Setup virtualenv
python -m venv .venv
source ./.venv/bin/activate
# Install as editable including test dependencies
pip install -e ".[tests]"- Follow general git guidelines.
- Keep it simple. Run
black .to auto format the code. - Test your changes locally by running
pytest(pass--cov --cov-report htmlfor browsable coverage report). - If you are familiar with tox, you may want to use it for testing in different python versions.
- environs - simplified environment variable parsing.