Skip to main content

PyPI Build Status Coverage Report Python Versions

Python module for sourcing a bash script to augment the environment. Supports Python 2.7 and 3.4+

Rationale

12-factor apps require configuration loaded from the environment.

That’s easy on a platform like Heroku, where the environment is preset by the user with commands like heroku config:set. But it’s messier in development and non-Heroku deployments, where the environment might need to be loaded from a file.

This package provides a mechanism for sourcing a Bash script to update Python’s environment (os.environ). Commonly the external file is called env.bash, hence the name of this project.

Installation

Install from PyPI:

pip install envbash

Usage

Call load_envbash to source a Bash script into the current Python process. Any variables that are set in the script, regardless of whether they are explicitly exported, will be added to the process environment.

For example, given env.bash with the following content:

FOO='bar baz qux'

This can be loaded into Python:

import os
from envbash import load_envbash

load_envbash('env.bash')

print(os.environ['FOO'])  #=> bar baz qux

FAQ

How is this different from dotenv?

Both projects aim to solve the same problem, but differ in approach. In particular, dotenv uses an ad hoc config syntax whereas envbash uses Bash.

dotenv’s syntax becomes a problem with multi-line strings. dotenv intends for the .env file to be readable by the shell, but the dotenv format for multi-line strings isn’t compatible with the shell.

If the point is to have a configuration language that’s well-suited to environment variables, it’s hard to beat pure Bash, and it’s guaranteed to source properly into the shell.

Should I commit env.bash to source control?

No, definitely not. The purpose of env.bash is to store development configuration that isn’t suitable for committing to the repository, whether that’s secret keys or developer-specific customizations. In fact, you should add the following line to .gitignore:

/env.bash

Is it necessary to explicitly export variables in env.bash?

No, envbash prefixes sourcing your env.bash with set -a which causes all newly-set variables to be exported automatically. If you would rather explicitly export variables, you can set +a at the top of your env.bash.

How do I put a multi-line string into env.bash?

You can put newlines directly into a multi-line string in Bash, so for example this works:

PRIVATE_KEY="
-----BEGIN RSA PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END RSA PRIVATE KEY-----"

Does envbash override my environment settings?

By default your local environment settings win, so you can override the content of env.bash by explicitly exporting variables in your shell.

You can change this behavior. This makes sense for a deployed instance that gets full configuration from env.bash and needs to be protected from the calling environment.

load_envbash('env.bash', override=True)

Can I remove settings from the environment?

By default envbash doesn’t remove settings, but you can change this behavior.

load_envbash('env.bash', remove=True)

This will cause any variables that you explicitly unset in env.bash to be removed from Python’s os.environ as well.

How do I source env.bash into my guest shell environment?

Assuming that your source directory is available on the default /vagrant mount point in the guest, you can add add this line at the bottom of /home/vagrant/.bash_profile:

set -a; source /vagrant/env.bash; set +a

Note that this means that settings are loaded on vagrant ssh so you need to exit the shell and rerun vagrant ssh to refresh if you change settings.

What about Ruby?

See envbash-ruby

Metadata

Release files for envbash 2.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for envbash 2.0.0
File Size Uploaded Provenance Actions
envbash-2.0.0.tar.gz 7.2 kB Without provenance Details for envbash-2.0.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for envbash 2.0.0
File Interpreter ABI Platform Actions
envbash-2.0.0-py3-none-any.whl Python 3 none any Details for envbash-2.0.0-py3-none-any.whl

Total release size: 13.2 kB

Release files / envbash-2.0.0.tar.gz

Download URL envbash-2.0.0.tar.gz
Size 7.2 kB
Tags Source
SHA-256 checksum
How to use checksums
5aac46a5fe82e8f8de0be6282f25cdc6f6997e8792833b1b3c956d94e8473fe8
BLAKE2b-256 checksum
How to use checksums
2f69380824a691b51bde852b763f4f675a4fdbfd9cb66c11b10e9c6dee4d6b23
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release files / envbash-2.0.0-py3-none-any.whl

Download URL envbash-2.0.0-py3-none-any.whl
Size 6.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9fffd6d305768ab116d21c8467aa54b64884c6ba10a7953fe22250e4d1342138
BLAKE2b-256 checksum
How to use checksums
1f01b5f88b606591c545164d9643fcab9ca5bd3af57ff605ac28332e5cbd6c63
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Security for envbash 2.0.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page