尝试使用以下命令查看PYTHONHASHSEED
的值:
# (this is inside module_1.py)
os.environ['PYTHONHASHSEED']
引发一个KeyError:
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
的内容
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
访问它
发布于 2015-09-12 22:46:35
您可以在Python脚本中设置PYTHONHASHSEED,但它对hash()
函数的行为没有影响-它需要在解释器启动之前在解释器的环境中设置。
如何使用纯Python设置它的值
诀窍是在子进程中将环境变量传递给Python解释器。
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})
输出
hashseed 2929187283
-972692480
hashseed 393430205
2066796829
hashseed 2653501013
1620854360
hashseed 3616018455
-599248233
hashseed 3584366196
-2103216293
您可以更改cmd
列表,使其运行上面的hashtest.py
脚本:
cmd = ['python', 'hashtest.py']
或者如果hashtest.py
是可执行的,
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
#!/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
#!/usr/bin/env python
import os
s = 'abc'
print('Hashseed is', os.environ['PYTHONHASHSEED'])
print('hash of s is', hash(s))
典型输出
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
,那么你会这样做
cd /mnt/sda2/fred/python
接下来,使用以下命令使pyhashtest.bsh
成为可执行文件:
chmod a+x pyhashtest.bsh
然后用以下命令运行它
./pyhashtest.bsh
发布于 2017-07-24 21:18:46
“默认情况下打开散列随机化”意味着即使没有PYTHONHASHSEED
环境变量,它也是打开的-如果在环境中没有指定散列种子,则随机选择一个。这个选择是在python内部完成的,os.environ
数组不会更新。
https://stackoverflow.com/questions/32538764
复制相似问题