Mik*_*ler 5 python environment-variables deep-copy
我可能只是错过了一些关于 os.environ 或 copy.deepcopy 如何工作的文档,但似乎 copy.deepcopy 在 os.environ 上不起作用。但如果我将 os.environ 重建为新字典,它就可以正常工作。这是我的示例代码:
import copy
import os
tcsh_loc = '/bin/tcsh'
safe_dict = {}
for key in os.environ.keys():
safe_dict[key] = os.environ[key]
safe_dict['SAFE_ENV'] = 'non-leaked-var'
os.spawnv(os.P_WAIT, tcsh_loc, [tcsh_loc, '-c', 'echo $SAFE_ENV'])
os.spawnve(os.P_WAIT, tcsh_loc, [tcsh_loc, '-c', 'echo $SAFE_ENV'], safe_dict)
unsafe_dict = copy.deepcopy(os.environ)
unsafe_dict['UNSAFE_ENV'] = 'leaked-var'
os.spawnv(os.P_WAIT, tcsh_loc, [tcsh_loc, '-c', 'echo $UNSAFE_ENV'])
os.spawnve(os.P_WAIT, tcsh_loc, [tcsh_loc, '-c', 'echo $UNSAFE_ENV'], unsafe_dict)
Run Code Online (Sandbox Code Playgroud)
我期望得到的是:
SAFE_ENV: Undefined variable.
non-leaked-var
UNSAFE_ENV: Undefined variable.
leaked-var
Run Code Online (Sandbox Code Playgroud)
但我得到的是:
SAFE_ENV: Undefined variable.
non-leaked-var
leaked-var
leaked-var
Run Code Online (Sandbox Code Playgroud)
这意味着不知何故unsafe_dict['UNSAFE_ENV'] = 'leaked-var'分配以某种方式“泄漏”到 os.environ 中,大概是来自 os.environ 没有像我预期的那样被深度复制。
我认为这是某种已知的行为,但这对我来说似乎真的很奇怪,是不受欢迎的,至少在使用 os.spawnev() 之类的东西方面。我有一个笨拙的解决方法,但我有兴趣了解发生了什么以及是否有比 for 循环更优雅的解决方案......
os.environ类型为os._Environ,而不是列表或字典。合乎逻辑的是,实例的副本os._Environ也会修改环境。
查看os._Environ.__setitem__()函数。它将值存储在两个位置,一次使用putenv(),一个用于在字典中分配键self._data。
def __setitem__(self, key, value):
key = self.encodekey(key)
value = self.encodevalue(value)
self.putenv(key, value)
self._data[key] = value
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5059 次 |
| 最近记录: |