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

2024-04-17

试图看到的价值PYTHONHASHSEED https://docs.python.org/3.4/using/cmdline.html?highlight=pythonhashseed#envvar-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 by

for i in sorted(os.environ):
    print(i)

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

揭示了PYTHONHASHSEED不在里面,但我很确定它应该有价值,因为在 Python 3.3 及更高版本上,默认情况下打开哈希随机化 https://docs.python.org/3.4/using/cmdline.html?highlight=pythonhashseed#cmdoption-R.

问题:
为什么我不能以这种方式访问​​它的值以及如何通过module_1.py?


You can在 Python 脚本中设置 PYTHONHASHSEED,但它对hash()function - 需要在解释器启动之前在解释器的环境中设置。


如何使用纯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})

output

hashseed 2929187283
-972692480

hashseed 393430205
2066796829

hashseed 2653501013
1620854360

hashseed 3616018455
-599248233

hashseed 3584366196
-2103216293

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

cmd = ['python', 'hashtest.py']

or if hashtest.py是可执行的,

cmd = './hashtest.py'

通过通过dict as the 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

哈希测试.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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法通过模块查看或修改 PYTHONHASHSEED 的值 的相关文章

随机推荐