无法通过模块访问PYTHONHASHSEED的值

时间:2015-09-12 12:25:56

标签: python environment-variables python-3.4

尝试使用以下内容查看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访问它?

3 个答案:

答案 0 :(得分:1)

&#34;哈希随机化默认打开&#34;意味着(除其他外)即使没有PYTHONHASHSEED环境变量也会打开它 - 如果在环境中未指定散列种子,则随机选择一个。此选择在python内部完成,os.environ数组未更新。

答案 1 :(得分:0)

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

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

Python脚本hashtest.py从环境中读取PYTHONHASHSEED并打印它以显示它具有我们期望它具有的值。然后我们计算&amp;打印短字符串的哈希。

<强> 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

这是一种替代的纯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

答案 2 :(得分:0)

Use "set PYTHONHASHSEED=1" if you are working on windows in the terminal. Then python yourpythonFile.py
OR
"PYTHONHASHSEED=1" if you are using Linux.Then python yourpythonFile.py