Python - временно измените среду текущего процесса

Я использую следующий код для временного изменения переменных среды.

@contextmanager
def _setenv(**mapping):
    """``with`` context to temporarily modify the environment variables"""
    backup_values = {}
    backup_remove = set()
    for key, value in mapping.items():
        if key in os.environ:
            backup_values[key] = os.environ[key]
        else:
            backup_remove.add(key)
        os.environ[key] = value

    try:
        yield
    finally:
        # restore old environment
        for k, v in backup_values.items():
            os.environ[k] = v
        for k in backup_remove:
            del os.environ[k]

Это with контекст главным образом используется в тестовых сценариях. Например,

def test_myapp_respects_this_envvar():
    with _setenv(MYAPP_PLUGINS_DIR='testsandbox/plugins'):
        myapp.plugins.register()
        [...]

Мой вопрос: есть ли простой/изящный способ записать _setenv? Я думал о фактическом выполнении backup = os.environ.copy() и затем os.environ = backup .. но я не уверен, влияло ли это на поведение программы (например: если os.environ ссылается в другом месте в интерпретаторе Python).

24
задан alain.janinm 1 May 2012 в 09:56
поделиться