使用Python 2.7时导入hashlib出错,但在2.6中没有出现该问题。

32

我在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:


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

我不明白为什么在同一台机器上尝试导入时会出现这个错误。

提前感谢您的帮助!


8
运行python2.7 -v -c "import hashlib"可以查看它试图导入的内容列表以及导入失败的内容。运行命令ldd /usr/local/lib/python2.7/_hashlibmodule.so可以告诉你什么?我怀疑由于你本地编译的Python 2.7链接方式不同,导致其无法加载所需的模块。 - gps
@gps ldd /usr/local/lib/python2.7/_hashlibmodule.so 返回一个 cannot open file: No such file or directory 错误。第一个命令的输出在这里:(http://pastebin.com/wbd1qAtv)感谢您的帮助!;) - SuperPython
ldd的结果:libssl.so.1.0.0 =>(文件未找到) libcrypto.so.1.0.0 =>(文件未找到) libpython2.7.so.1.0 =>/usr/local/lib/libpython2.7.so.1.0 libsocket.so.1 =>/usr/lib/libsocket.so.1 libnsl.so.1 =>/usr/lib/libnsl.so.1 librt.so.1 =>/usr/lib/librt.so.1 libdl.so.1 =>/usr/lib/libdl.so.1 libm.so.2 =>/usr/lib/libm.so.2 libc.so.1 =>/usr/lib/libc.so.1 libmp.so.2 =>/usr/lib/libmp.so.2 libmd.so.1 =>/usr/lib/libmd.so.1 libscf.so.1 =>/usr/lib/libscf.so.1 libaio.so.1 =>/usr/lib/libaio.so.1 libdoor.so.1 =>/usr/lib/libdoor.so.1 libuutil.so.1 =>/usr/lib/libuutil.so.1 libgen.so.1 =>/usr/lib/libgen.so.1 - SuperPython
1
看起来文件 libssl.so.1.0.0libcrypto.so.1.0.0 没有正确地与库链接。我用 Python2.6 做了同样的事情,并找到了与 openssl_0.9.8 库的链接。 - SuperPython
Python2.7的软件包依赖于libssl1_0_0(openssl_1.0运行时库)。 我已经安装了它,并重新安装了Python2.7,但是ldd命令输出中仍然显示libssl.so.1.0.0和libcrypto.so.1.0.0文件为“(文件未找到)”。 - SuperPython
显示剩余5条评论
4个回答

24

Python2.7包依赖于libssl1_0_0包(openssl_1.0运行库)。

我已经安装了它,并将/usr/local/ssl/lib目录添加到$LD_LIBRARY_PATH环境变量中。

现在它完美运行!:)


在$LD_LIBRARY_PATH环境变量中执行/usr/local/ssl/lib目录的命令是什么? - ealeon
1
export LD_LIBRARY_PATH="/usr/local/ssl/lib" - Steve Peak
在Ubuntu上,在安装Python之前安装libssl1.0-dev可以解决问题:sudo apt-get install libssl1.0-dev - igr

14

对我来说也是同样的错误。我的情况是将一个复制的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

12
您可以使用以下命令,并检查缺少哪些库:
ldd /path/to/Python-Library/_hashlibmodule.so

e.g

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)

1
这个例子非常有帮助!我用下面的命令在特定环境中查找所有缺失的SOs:ldd /opt/test/python/lib/python2.7/lib-dynload/*.so | grep "not found" - Michael Allan Jackson
1
如果SSL支持没有编译进去,你将看不到这些引用 - 但它们的缺失应该告诉你为什么它失败了。 - andy_js

0

我知道你正在使用Solaris,但是我已经按照这些说明安装了旧版的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接