【发布时间】:2020-02-28 10:17:39
【问题描述】:
可以通过简单地将其设置为这样的新值来更改当前进程吗?
os.environ['PYTHONHASHSEED'] = 'random'
【问题讨论】:
标签: python
可以通过简单地将其设置为这样的新值来更改当前进程吗?
os.environ['PYTHONHASHSEED'] = 'random'
【问题讨论】:
标签: python
这取决于你的意思。
如果你的意思是改变当前解释器的行为,那么答案是否:
修改os.environ 不可靠,因为在某些操作系统中您无法修改环境(请参阅os.environ 的文档)。
仅在启动解释器时检查环境变量,因此之后更改它们不会对当前的 python 实例产生任何影响。来自the documentation:
这些环境变量会影响 Python 的行为,它们是 在
-E或-I以外的命令行开关之前处理。
(这意味着它们仅在启动解释器时被检查,远在任何用户代码运行之前)。
AFAIK,随机哈希种子不能动态设置,所以如果你想激活哈希随机化,你必须重新启动解释器。
如果你的意思是让当前解释器产生的新进程表现得好像该值是之前设置的,那么是,假设你正在运行支持putenv的平台。生成新进程时,默认情况下,它会继承当前进程的环境。您可以使用一个简单的脚本对此进行测试:
#check_environ.py
import os
import subprocess
os.environ['A'] = '1'
proc = subprocess.call(['python', '-c', 'import os;print(os.environ["A"])'])
产量:
$ python check_environ.py
1
请注意,putenv 实现中存在已知错误(例如在 Mac OS X 中),它会泄漏内存。所以修改环境是你要尽量避免的事情。
【讨论】:
subprocess.call,您可以通过传递显式的增强环境来解决修改环境的问题。 e = dict(os.environ); e.update(PYTHONHASHSEED='random'); subprocess.call([...], env=e)