Ich verwende den folgenden Code, um vorübergehend Umgebungsvariablen zu ändern.Python - vorübergehend die Umgebung des aktuellen Prozesses ändern
@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]
Dieser with
Kontext wird hauptsächlich in Testfällen verwendet. Zum Beispiel
def test_myapp_respects_this_envvar():
with _setenv(MYAPP_PLUGINS_DIR='testsandbox/plugins'):
myapp.plugins.register()
[...]
Meine Frage: Gibt es eine einfache/elegante Weise _setenv
zu schreiben? Ich dachte darüber nach, backup = os.environ.copy()
und dann os.environ = backup
zu tun .. aber ich bin mir nicht sicher, ob das das Programmverhalten beeinflussen würde (zB: wenn os.environ
ist verwiesen an anderer Stelle im Python-Interpreter).
Gut. Ich benutze '.copy()' anstelle von 'dict()' obwohl. –
wollte ich nur, danke! – nnachefski
Ok, aber im Falle eines Fehlers (Ausnahme) während [...] werden Umgebungsvariablen nicht wiederhergestellt: ein 'try ... finally ...' ist dafür erforderlich. –