Я использую следующий код для временного изменения переменных среды.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
.. но я не уверен, повлияет ли это на поведение программы (например: if os.environ
- ссылается на в другом месте в интерпретаторе Python).
Хорошо. Я использую '.copy()' вместо 'dict()' хотя. –
просто хотел, мне нужно, спасибо! – nnachefski
Хорошо, но в случае сбоя (исключения) во время [...] переменные среды не восстанавливаются: для этого требуется 'try ... finally ...'. –