Skip to main content

A Python port of daemontools' envdir.

Project description

Build Status

This is a Python port of daemontools’ tool envdir.

What?

envdir runs another program with a modified environment according to files in a specified directory.

So for example, imagine a software you want to run on a server but don’t want to leave certain configuration variables embedded in the program’s source code. A common pattern to solve this problem is to use environment variables to separate configuration from code.

envdir allows you to set a series of environment variables at once to simplify maintaing complicated environments, for example in which you have multiple sets of those configuration variables depending on the infrastructure you run your program on (e.g. Windows vs. Linux, Staging vs. Production, Old system vs. New system etc).

Let’s have a look at a typical envdir:

$ tree envs/prod/
envs/prod/
├── DJANGO_SETTINGS_MODULE
├── MYSITE_DEBUG
├── MYSITE_DEPLOY_DIR
├── MYSITE_SECRET_KEY
└── PYTHONSTARTUP

0 directories, 3 files
$ cat envs/prod/DJANGO_SETTINGS_MODULE
mysite.settings
$

As you can see each file has a capitalized name and contains the value of the environment variable to set when running your program. To use it, simply prefix the call to your program with envdir:

$ envdir envs/prod/ python manage.py runserver

That’s it, nothing more and nothing less. The way you structure your envdir is left to you but can easily match your configuration requirements and integrate with other configuration systems. envdirs contain just files after all.

An interesting summary about why it’s good to store configuration values in environment variables can be found on the 12factor site.

Why?

Because envdir is small enough that it shouldn’t be tied to a bigger software distribution like daemontools that requires a compiler.

Also, this Python port can easily be used on Windows, not only UNIX systems.

Installation

pip install envdir

or:

easy_install envdir

Usage

Command line

Quoting the envdir documentation:

envdir runs another program with environment modified according to files in a specified directory.

Interface:

envdir d child

d is a single argument. child consists of one or more arguments.

envdir sets various environment variables as specified by files in the directory named d. It then runs child.

If d contains a file named s whose first line is t, envdir removes an environment variable named s if one exists, and then adds an environment variable named s with value t. The name s must not contain =. Spaces and tabs at the end of t are removed. Nulls in t are changed to newlines in the environment variable.

If the file s is completely empty (0 bytes long), envdir removes an environment variable named s if one exists, without adding a new variable.

envdir exits 111 if it has trouble reading d, if it runs out of memory for environment variables, or if it cannot run child. Otherwise its exit code is the same as that of child.

Alternatively you can also use the python -m envdir form to call envdir.

Python

To use envdir in a Python file (e.g. Django’s manage.py) you can use:

import envdir
envdir.read()

envdir will try to find an envdir directory next to the file you modified.

It’s also possible to explicitly pass the path to the envdir:

import os
import envdir

envdir.read('/home/jezdez/mysite/envs/prod')

Shell

envdir also includes an optional CLI tool called envshell which launches a subshell using the given directory. It basically allows you to make a set of environment variable stick to your current shell session if you happen to use envdir a lot outside of simple script use.

For example:

$ envshell ~/mysite/envs/prod/
Launching envshell for /home/jezdez/mysite/envs/prod. Type 'exit' or 'Ctrl+D' to return.
$ python manage.py runserver
..

To leave the subshell, simply use the exit command or press Ctrl+D.

Feedback

Feel free to open tickets at https://github.com/jezdez/envdir/issues. Say thanks at https://www.gittip.com/jezdez/.

Changelog

0.4.1 (08/21/2013)

  • Fixed envdir.read() to actually work with already existing environment variables. Extended docs to test Python use.

0.4 (08/09/2013)

  • Added envshell command which launches a subshell using the environment as defined in the given envdir. Example:

    $ envshell ~/mysite/envs/prod/
    Launching envshell for /home/jezdez/mysite/envs/prod. Type 'exit' or 'Ctrl+D' to return.
    $ python manage.py runserver
    ..

0.3 (07/30/2013)

  • Catch KeyboardInterrupt exceptions to not show a traceback from envdir but the repsonse from the called command.

  • Allow multiline environment variables. Thanks to Horst Gutmann for the suggestion. This is a departure from daemontools’ standard which only allows the first line of the environment variable file.

0.2.1 (07/11/2013)

  • Fixed python -m envdir

  • Extended README to better describe the purpose

0.2 (07/10/2013)

  • Added ability to use envdir from Python.

0.1 (07/10/2013)

  • Initial release.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

envdir-0.4.1.tar.gz (7.0 kB view details)

Uploaded Source

Built Distribution

envdir-0.4.1-py2.py3-none-any.whl (9.7 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file envdir-0.4.1.tar.gz.

File metadata

  • Download URL: envdir-0.4.1.tar.gz
  • Upload date:
  • Size: 7.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for envdir-0.4.1.tar.gz
Algorithm Hash digest
SHA256 32ce2834c79cc106fd87a23d7dc0da0c37beb021c5b86ced2e9f0aabc629d646
MD5 f84ba3e2b48b16aef6091a1073c2d7fa
BLAKE2b-256 4f5684c9ca779f073e14cbc123eb0aee15b24d0c8717052961476ca5c523ca61

See more details on using hashes here.

Provenance

File details

Details for the file envdir-0.4.1-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for envdir-0.4.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 95809b45c006b0feaf17b965ea1ce34920dd2c346ae1cb684b9b6690f738b37f
MD5 0dc1281f4b7818942ce82f1da38bb0c7
BLAKE2b-256 783b8aa90c0c575db3969f6c63a56ebb8a647e4e30290619bbf9dd2b3a1ec794

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page