【问题标题】:Can os.environ['PYTHONHASHSEED'] be set dynamically from within an application?可以从应用程序中动态设置 os.environ['PYTHONHASHSEED'] 吗?
【发布时间】:2020-02-28 10:17:39
【问题描述】:

可以通过简单地将其设置为这样的新值来更改当前进程吗?

os.environ['PYTHONHASHSEED'] = 'random'

【问题讨论】:

    标签: python


    【解决方案1】:

    这取决于你的意思。

    如果你的意思是改变当前解释器的行为,那么答案是

    1. 修改os.environ 不可靠,因为在某些操作系统中您无法修改环境(请参阅os.environ 的文档)。

    2. 仅在启动解释器时检查环境变量,因此之后更改它们不会对当前的 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)
    • @chepner 是的,我很清楚这一点。文档中明确提到了这一点。我正在回答一个关于修改环境当前进程的问题。事实上,部分答案是对 OP 可能意味着什么的猜测;如果他编辑他的问题以澄清他的意思,我会添加该建议(当我第一次写答案时,这已经在我的想法中了)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多