首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法通过模块查看或修改PYTHONHASHSEED的值

无法通过模块查看或修改PYTHONHASHSEED的值
EN

Stack Overflow用户
提问于 2015-09-12 20:25:56
回答 2查看 5.6K关注 0票数 9

尝试使用以下命令查看PYTHONHASHSEED的值:

代码语言:javascript
复制
# (this is inside module_1.py)
os.environ['PYTHONHASHSEED'] 

引发一个KeyError:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/home/black/Dev/Projects/module_1.py", line 2, in <module>
    os.environ['PYTHONHASHSEED']
  File "/usr/lib/python3.4/os.py", line 631, in __getitem__
    raise KeyError(key) from None
KeyError: 'PYTHONHASHSEED'

打印os.environ的内容

代码语言:javascript
复制
for i in sorted(os.environ):
    print(i)

# prints:
# CLUTTER_IM_MODULE
# COMPIZ_BIN_PATH
# ...
# etc.

显示PYTHONHASHSEED不在其中,但我非常确定它应该有一个值,因为on Python 3.3 and greater, hash randomization is turned on by default

问题:

为什么我不能以这种方式访问它的值,我如何通过module_1.py访问它

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-12 22:46:35

您可以在Python脚本中设置PYTHONHASHSEED,但它对hash()函数的行为没有影响-它需要在解释器启动之前在解释器的环境中设置。

如何使用纯Python设置它的值

诀窍是在子进程中将环境变量传递给Python解释器。

代码语言:javascript
复制
import random
from subprocess import call

random.seed(37)
cmd = ['python', '-c', 'print(hash("abc"))']

for i in range(5):
    hashseed = bytes(random.randint(0, 4294967295))
    print('\nhashseed', hashseed)
    call(cmd, env={'PYTHONHASHSEED': hashseed})

输出

代码语言:javascript
复制
hashseed 2929187283
-972692480

hashseed 393430205
2066796829

hashseed 2653501013
1620854360

hashseed 3616018455
-599248233

hashseed 3584366196
-2103216293

您可以更改cmd列表,使其运行上面的hashtest.py脚本:

代码语言:javascript
复制
cmd = ['python', 'hashtest.py']

或者如果hashtest.py是可执行的,

代码语言:javascript
复制
cmd = './hashtest.py'

通过将dict作为env参数传递,我们将替换将传递给命令的默认环境。如果您需要访问这些其他环境变量,那么您应该改为在调用脚本中修改os.environ,例如os.environ['PYTHONHASHSEED'] = hashseed

如何使用Bash设置它的值

首先,我们有一个简短的Bash脚本pyhashtest.bsh,它使用RANDOM环境变量作为PYTHONHASHSEED的种子。必须导出此变量,以便Python解释器可以看到它。然后我们运行Python脚本hashtest.py。我们在一个循环中这样做了5次,所以我们可以看到使用不同的种子对散列值有影响。

Python脚本hashtest.py从环境中读取PYTHONHASHSEED并打印它,以显示它具有我们期望的值。然后,我们计算并打印一个短字符串的散列。

pyhashtest.bsh

代码语言:javascript
复制
#!/usr/bin/env bash

for((i=0; i<5; i++)); do
    n=$RANDOM
    echo "$i: Seed is $n"
    export PYTHONHASHSEED="$n"
    python hashtest.py
    echo
done

hashtest.py

代码语言:javascript
复制
#!/usr/bin/env python
import os

s = 'abc'
print('Hashseed is', os.environ['PYTHONHASHSEED'])
print('hash of s is', hash(s))

典型输出

代码语言:javascript
复制
0: Seed is 9352
Hashseed is 9352
hash of s is 401719638

1: Seed is 24945
Hashseed is 24945
hash of s is -1250185385

2: Seed is 17661
Hashseed is 17661
hash of s is -571990551

3: Seed is 24313
Hashseed is 24313
hash of s is 99658978

4: Seed is 21142
Hashseed is 21142
hash of s is -662114263

要运行这两个程序,请将它们保存到相同的目录中,例如运行Python脚本的常用目录。然后打开一个Bash shell,并使用cd命令导航到该目录。

例如,如果你已经将脚本保存到/mnt/sda2/fred/python,那么你会这样做

代码语言:javascript
复制
cd /mnt/sda2/fred/python

接下来,使用以下命令使pyhashtest.bsh成为可执行文件:

代码语言:javascript
复制
chmod a+x pyhashtest.bsh

然后用以下命令运行它

代码语言:javascript
复制
./pyhashtest.bsh
票数 6
EN

Stack Overflow用户

发布于 2017-07-24 21:18:46

“默认情况下打开散列随机化”意味着即使没有PYTHONHASHSEED环境变量,它也是打开的-如果在环境中没有指定散列种子,则随机选择一个。这个选择是在python内部完成的,os.environ数组不会更新。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32538764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档