使用 python 2.7 导入 hashlib 而不是 2.6 时出错
Posted
技术标签:
【中文标题】使用 python 2.7 导入 hashlib 而不是 2.6 时出错【英文标题】:Error importing hashlib with python 2.7 but not with 2.6 【发布时间】:2013-12-22 08:29:56 【问题描述】:我使用的是 Solaris 10 (x86)。
到目前为止,我使用的是 python2.6。今天我安装了python2.7,在2.7上导入hashlib时出现了一个奇怪的错误,但在2.6上没有:
Python 2.6:
root@myserver [PROD] # python2.6 -c "import hashlib"
root@myserver [PROD] #
Python 2.7:
root@myserver [PROD] # python2.7 -c "import hashlib"
ERROR:root:code for hash md5 was not found.
Traceback (most recent call last):
File "/usr/local/lib/python2.7/hashlib.py", line 139, in <module>
globals()[__func_name] = __get_hash(__func_name)
File "/usr/local/lib/python2.7/hashlib.py", line 91, in __get_builtin_constructor
raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type md5
ERROR:root:code for hash sha1 was not found.
Traceback (most recent call last):
File "/usr/local/lib/python2.7/hashlib.py", line 139, in <module>
globals()[__func_name] = __get_hash(__func_name)
File "/usr/local/lib/python2.7/hashlib.py", line 91, in __get_builtin_constructor
raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type sha1
ERROR:root:code for hash sha224 was not found.
Traceback (most recent call last):
File "/usr/local/lib/python2.7/hashlib.py", line 139, in <module>
globals()[__func_name] = __get_hash(__func_name)
File "/usr/local/lib/python2.7/hashlib.py", line 91, in __get_builtin_constructor
raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type sha224
ERROR:root:code for hash sha256 was not found.
Traceback (most recent call last):
File "/usr/local/lib/python2.7/hashlib.py", line 139, in <module>
globals()[__func_name] = __get_hash(__func_name)
File "/usr/local/lib/python2.7/hashlib.py", line 91, in __get_builtin_constructor
raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type sha256
ERROR:root:code for hash sha384 was not found.
Traceback (most recent call last):
File "/usr/local/lib/python2.7/hashlib.py", line 139, in <module>
globals()[__func_name] = __get_hash(__func_name)
File "/usr/local/lib/python2.7/hashlib.py", line 91, in __get_builtin_constructor
raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type sha384
ERROR:root:code for hash sha512 was not found.
Traceback (most recent call last):
File "/usr/local/lib/python2.7/hashlib.py", line 139, in <module>
globals()[__func_name] = __get_hash(__func_name)
File "/usr/local/lib/python2.7/hashlib.py", line 91, in __get_builtin_constructor
raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type sha512
我不明白为什么会出现此错误,因为我正在在同一台机器上尝试导入。
提前感谢您的帮助!
【问题讨论】:
可能是因为您的 hashlib 版本仅适用于 Python 2.6?你是哪个版本的? @alKidhashlib
是 Python 2.5 以来的内置模块
另外,***.com/questions/11433108/…的副本
运行 python2.7 -v -c "import hashlib"
以查看它正在尝试和未能导入的内容列表。 ldd /usr/local/lib/python2.7/_hashlibmodule.so
告诉你什么?我 怀疑 由于您本地编译的 python2.7 的链接方式,它无法加载...
因此,libssl.so.1.0.0
和 libcrypto.so.1.0.0
文件似乎没有正确“链接”到库。我对 python2.6 做了同样的事情,发现了 openssl_0.9.8 库的链接。
【参考方案1】:
我知道您使用的是 Solaris,但我已按照 these instructions 安装旧的 libssl1.0-dev,它可以在 Ubuntu 20.04 上运行。
编辑文件 /etc/apt/sources.list 并将这一行添加到它的末尾。
deb http://security.ubuntu.com/ubuntu bionic-security main
运行之后:
sudo apt update && apt-cache policy libssl1.0-dev
最后,
sudo apt-get install libssl1.0-dev
【讨论】:
【参考方案2】:您可以使用以下命令检查缺少哪些库,
ldd /path/to/Python-Library/_hashlibmodule.so
例如
ldd /usr/local/lib/python2.7/_hashlibmodule.so
如果你得到如下输出,这意味着你缺少必要的 openssl 库
linux-vdso.so.1 => (0x00007fffd6f6a000)
libssl.so.6 => not found
libcrypto.so.6 => not found
libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007ffb18b54000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ffb18937000)
libc.so.6 => /lib64/libc.so.6 (0x00007ffb185a2000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007ffb1839e000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007ffb1819b000)
libm.so.6 => /lib64/libm.so.6 (0x00007ffb17f16000)
/lib64/ld-linux-x86-64.so.2 (0x0000003e0a000000)
【讨论】:
这个例子很有帮助!我使用以下方法在特定环境中查找所有丢失的 SO:ldd /opt/test/python/lib/python2.7/lib-dynload/*.so | grep "not found"
如果 SSL 支持未编译,您将看不到这些引用 - 但它们的缺失应该告诉您失败的原因。【参考方案3】:
对我来说同样的错误。我的案例是复制的virtenv
在新服务器上给我这个错误。默认的 python 正在运行。
我用过
python2.7 -v -c "import hashlib" 2> output.txt
您应该在您的output.txt
中看到类似以下内容的内容:
import hashlib # precompiled from hashlib.pyc
dlopen("/path/to/virtenv/lib/python2.7/lib-dynload/_hashlib.so", 2);
ldd /path/to/virtenv/lib/python2.7/lib-dynload/_hashlib.so
...
libssl.so.0.9.8 => not found
libcrypto.so.0.9.8 => not found
...
所以我所做的只是:
cp /usr/lib/python2.7/lib-dynload/_hashlib.so /*path-to-virtenv*/manager/lib/python2.7/lib-dynload/_hashlib.so
【讨论】:
【参考方案4】:python2.7 包依赖于libssl1_0_0
包(openssl_1.0 运行时库)。
我安装了它,并在$LD_LIBRARY_PATH
环境变量中添加了/usr/local/ssl/lib
目录。
现在它可以完美运行了! :)
【讨论】:
在 $LD_LIBRARY_PATH 环境变量中执行 /usr/local/ssl/lib 目录的命令是什么export LD_LIBRARY_PATH="/usr/local/ssl/lib"
在 ubuntu 上,在安装 python 之前安装 libssl1.0-dev:sudo apt-get install libssl1.0-dev
以上是关于使用 python 2.7 导入 hashlib 而不是 2.6 时出错的主要内容,如果未能解决你的问题,请参考以下文章