使用复制.deepcopy打开操作系统环境在python中出现了中断

2024-06-28 20:35:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我可能只是错过了一些关于操作系统环境或者复制.deepcopy很有用,但看起来复制.deepcopy不起作用操作系统环境. 但如果我重建操作系统环境在一本新字典里,它工作得很好。下面是我的示例代码:

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)

我希望得到的是:

^{pr2}$

但我要说的是:

SAFE_ENV: Undefined variable.
non-leaked-var
leaked-var
leaked-var

这意味着unsafe_dict['UNSAFE_ENV'] = 'leaked-var'赋值以某种方式“泄漏”到操作系统环境,大概是从操作系统环境没有像我预期的那样被深度复制。在

我认为这是一种已知的行为,但它看起来很奇怪,我不喜欢,至少在使用像os.spawnev操作系统(). 我有一个笨拙的解决办法,但我有兴趣了解发生了什么,如果有比for循环更优雅的解决方案。。。在


Tags: echoenv环境osvarlocdictsafe
2条回答

os.environos._Environ类型,不是列表或字典。合乎逻辑的是,os._Environ实例的副本也会修改环境。在

请参见os._Environ.__setitem__()函数。它将值存储在2个位置,一次使用putenv()和一个来分配self._data字典中的键。在

def __setitem__(self, key, value):
    key = self.encodekey(key)
    value = self.encodevalue(value)
    self.putenv(key, value)
    self._data[key] = value

您可以更容易地重建它:只需使用dict(os.environ)。在

简单测试:

import os
a=os.environ
b=dict(os.environ)

print type(a), type(b)
# -> <type 'instance'> <type 'dict'>

print a['PWD'], b['PWD']
# -> /home/max /home/max

b['PWD']='/fooo'
print a['PWD'], b['PWD']
# -> /home/max /fooo

相关问题 更多 >