Skip to main content
Join the official 2020 Python Developers SurveyStart the survey!

Environment Variable Context Manager

Project description


Build Status codecov

Manage environment variables in a temporary scope.

Some products use environment variables as a primary means to supply credentials. To ensure the lifetime of exposed credentials is short, wrap them in a TemporaryEnvironment so that they are automatically destroyed on scope exit.

You can:

  • Set or unset environment variables inside a with code block,
  • Get a warning if the code block modifies one of the environment variables,
  • Optionally bypass restoration of the original environment variable value if the code block modifies the environment variable.


Install the latest version of tempenv:

    pip install tempenv


Set some environment variables temporarily (see

    def test_set(self):
        user_before = os.environ.get("USER")
        with TemporaryEnvironment({"USER": "nobody", "OTHER": "foo"}):
            assert os.environ.get("USER") == "nobody"
            assert os.environ.get("OTHER") == "foo"
        assert os.environ.get("USER") == user_before

Changing the value to None will unset the environment variable during the code block (see

    def test_unset(self):
        os.environ["DEBUG"] = "1"
        with TemporaryEnvironment({"DEBUG": None}):
            assert "DEBUG" not in os.environ
        assert "DEBUG" in os.environ

Changing a temporary environment variable during the scope will cause a warning (see

    def test_overwritten_in_context(self):
        with self.assertWarnsRegex(EnvironmentVariableChangedWarning, "FOO"):
            with TemporaryEnvironment({"FOO": "BAR"}):
                os.environ["FOO"] = "SAM"

If you set the optional argument restore_if_changed=False then a change during the scope of the TemporaryEnvironment will not issue a warning and will not restore to the original value (see

    def test_ignored_overwrite_in_context(self):
        os.environ["FOO"] = "BAR"
        with TemporaryEnvironment({"FOO": "SAM"}, restore_if_changed=False):
            os.environ["FOO"] = "DEAN"
        assert os.environ["FOO"] == "DEAN"

You can use TemporaryEnvironment in a unittest scope as follows (see

    @TemporaryEnvironment({"USER": "Crowley"})
    def test_check(self):
        assert os.environ.get("USER") == "Crowley"


Released under the Apache Software License, Version 2.0 (see LICENSE):

   Copyright (C) 2019 James E. King III (@jeking3) <>



  • Added decorator support.
  • Updated README with more examples.


  • Initial release.


Please report any bugs that you find here. Or, even better, fork the repository on GitHub and create a pull request (PR). We welcome all changes, big or small, and we will help you make the PR if you are new to git (just ask on the issue and/or see CONTRIBUTING.rst).

Project details

Download files

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

Files for tempenv, version 0.2.0
Filename, size File type Python version Upload date Hashes
Filename, size tempenv-0.2.0-py3-none-any.whl (9.2 kB) File type Wheel Python version py3 Upload date Hashes View
Filename, size tempenv-0.2.0.tar.gz (9.9 kB) File type Source Python version None Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page