我使用下面的代碼來臨時修改環境變量。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解釋器的其他地方)。
好。儘管我使用'.copy()'而不是'dict()'。 – 2010-01-13 19:21:38
只想我需要,謝謝! – nnachefski 2012-01-24 15:22:43
好的,但如果在[...]期間出現故障(異常),則不會恢復環境變量:需要'try ... finally ...'。 – 2016-08-08 16:20:57