J'utilise le code suivant pour modifier temporairement les variables d'environnement.Python - modifie temporairement l'environnement du processus en cours
@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]
Ce contexte with
est principalement utilisé dans les cas de test. Par exemple,
def test_myapp_respects_this_envvar():
with _setenv(MYAPP_PLUGINS_DIR='testsandbox/plugins'):
myapp.plugins.register()
[...]
Ma question: est-il un moyen simple/élégante d'écrire _setenv
? Je pensais réellement faire backup = os.environ.copy()
et puis os.environ = backup
.. mais je ne suis pas sûr si cela affecterait le comportement du programme (par exemple: si os.environ
est référencé ailleurs dans l'interpréteur Python).
Bonne. J'utilise '.copy()' au lieu de 'dict()' bien. –
juste voulu j'avais besoin, merci! – nnachefski
Ok, mais en cas d'échec (exception) pendant [...], les variables d'environnement ne sont pas restaurées: un 'try ... finally ...' est requis pour cela. –