Tôi sử dụng mã sau để tạm thời sửa đổi các biến môi trường.Python - tạm thời sửa đổi môi trường của quy trình hiện tại
@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]
Ngữ cảnh with
này chủ yếu được sử dụng trong các trường hợp thử nghiệm. Ví dụ:
def test_myapp_respects_this_envvar():
with _setenv(MYAPP_PLUGINS_DIR='testsandbox/plugins'):
myapp.plugins.register()
[...]
Câu hỏi của tôi: có cách đơn giản/thanh lịch để viết _setenv
? Tôi nghĩ về thực sự làm backup = os.environ.copy()
và sau đó os.environ = backup
.. nhưng tôi không chắc liệu điều đó có ảnh hưởng đến hành vi của chương trình hay không (ví dụ: nếu os.environ
là được tham chiếu ở nơi khác trong trình thông dịch Python).
Tốt. Tôi đang sử dụng '.copy()' thay vì 'dict()' mặc dù. –
chỉ muốn tôi cần thiết, cảm ơn! – nnachefski
Ok, nhưng trong trường hợp thất bại (ngoại lệ) trong [...], các biến môi trường không được khôi phục: một 'try ... finally ...' là bắt buộc cho điều đó. –