>>>inport hashlibpython
ERROR:root:code for hash md5 was not found.mysql
…linux
ValueError:unsupported hash type md5算法
…sql
ERROR:root:code for hash sha1 was not found.vim
…缓存
ValueError:unsupported hash type sha1less
…ssh
错误分析:函数
使用命令
>>>dir(hashlib)
['__all__', '__builtins__', '__doc__', '__file__', '__get_builtin_constructor', '__name__', '__package__' , 'algorithms', 'new', 'sha224', 'sha256', 'sha384', 'sha512']
会发现里面列出的和正常的相比缺乏了
'_hashlib','md5', 'sha1'
使用命令
>>>import _hashlib
ImportError: libssl.so.4: cannot open shared object file: No such file or directory
从hashlib.py的源码看出,对于hashlib提供的('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')等算法,hashlib的作法是先去检验Python内置的_hashlib是否支持openssh.
检查系统是否安装了openssl,没安装的话,先安装:
安装openssl,64位系统记得加上 -fPIC参数,否则编译hashlib会出现问题:/usr/local/lib/libcrypto.a: could not read symbols: Bad value
software: openssl-0.9.8 点击下载
[root@vqiu] # tar zxvf openssl-0.9.8k.tar.gz -C /opt/
[root@vqiu] # ./config --openssldir=/usr/local/ssl -fPIC
# ./config shared --openssldir=/repo/atxuser/robot/PACKAGES/openssl-1.0.2g --prefix=/repo/atxuser/robot/PACKAGES/openssl-1.0.2g
shared 生成动态连接库
[root@vqiu] # make depend
[root@vqiu] # make
[root@vqiu] # make test
[root@vqiu] # make install
编译hashlib 点击下载
$ wget http://pypi.python.org/packages/source/h/hashlib/hashlib-20081119.zip#md5=46e59db6d5cac34b3344ef0c30d0897f
$ unzip hashlib-20081119.zip
$ cd hashlib-20081119
$ sudo python setup.py install
$ openssl version
OpenSSL 1.0.0e 6 Sep 2011
已安装,可是python编译时没发现,经过使用ldd查看动态库依赖关系
$ export LD_TRACE_LOADED_OBJECTS=1
$ldd _hashlib.so
$ unset LD_TRACE_LOADED_OBJECTS
确实没有看到有libssl.so.4。
去/usr/lib和/lib下找发现有libssl.so.0.9.8,应该是这个版本的问题了,程序须要的是libssl.so.4. 因此是libssl.so.4动态库找不到的缘由致使hashlib模块认为使用cx_freeze编译后的python环境不具有openssl支持,进而使用第三方md5等算法,但此时运行环境中第三方md5等模块也不具有,因此程序运行时出错,
解决方案:
为解决这一问题能够手动修改lib库的软链接,
ln –s /usr/lib/libssl.so.0.9.8 /lib/libssl.so.4
接下来会发现找不到共享库文件libcrypto.so.4,一样,使用命令
ln –s /usr/lib/libcrypto.so.0.9.8 /lib/libcrypto.so.4
便可。
缺乏动态链接库.so--cannot open shared object file: No such file or directory
这种错误总结下来主要有3种方法:
1. 用ln将须要的so文件连接到/usr/lib或者/lib这两个默认的目录下边
ln -s /where/you/install/lib/*.so /usr/lib
sudo ldconfig
2.修改LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/where/you/install/lib:$LD_LIBRARY_PATH
sudo ldconfig
3.修改/etc/ld.so.conf,而后刷新
vim /etc/ld.so.conf
add /where/you/install/lib
sudo ldconfig
拓展阅读
dconfig是一个动态连接库管理命令
为了让动态连接库为系统所共享,还需运行动态连接库的管理命令--ldconfig
ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态 连接库(格式如前介绍,lib*.so*),进而建立出动态装入程序(ld.so)所需的链接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态连接库名字列表.
ln是linux中又一个很是重要命令,它的功能是为某一个文件在另一个位置创建一个同不的连接,这个命令最经常使用的参数是-s,具体用法是:ln –s 源文件 目标文件。
当咱们须要在不一样的目录,用到相同的文件时,咱们不须要在每个须要的目录下都放一个必须相同的文件,咱们只要在某个固定的目录,放上该文件,而后在 其它的目录下用ln命令连接(link)它就能够,没必要重复的占用磁盘空间。例如:ln –s /bin/less /usr/local/bin/less
-s 是代号(symbolic)的意思。
这里有两点要注意:第一,ln命令会保持每一处连接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;第二,ln的连接又 软连接和硬连接两种,软连接就是ln –s ** **,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬连接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,不管是软连接仍是硬连接,文件都保持同步变化。
若是你用ls察看一个目录时,发现有的文件后面有一个@的符号,那就是一个用ln命令生成的文件,用ls –l命令去察看,就能够看到显示的link的路径了。
linux库
库的目的是代码重用,提供共用的功能,某个程序为别的程序提供公开的接口等。 命名和编号: (1) 全部库名以lib开头,gcc在-l指定的文件名前自动插入lib,如libmysqlclient就用-lmysqlclient (2) .a是静态库(archive),如 libmysqlclient.a (3) .so是共享库(shared object),如libmysqlclient.so (4) 编号格式:library_name.major_num.minor_num.patch_num,如libmysqlclient.so.15.0.0 (5) _g和_p: /usr/lib/libform_g.a 中的_g表示这是libform.a的调试库,用locate _g.a会发现不少相似的库,但我用locate _g.so没有发现FC4有此类库;libxxx_p.a中的_p表示这是libxxx.a的性能分析库(profiling),但我用locate _p.a和locate _p.so没有发现FC4有此类路库。 库要和接口头文件配合使用,常见的库如: libc.so (不需头文件) 标准C库 libdl.so (dlfcn.h) 让程序在运行是加载和使用库代码,而不在编译时连接库 libglib.so (glib.h) Glib工具函数,例如hash, string等 libgthread.so (glib.h) 对Glib的线程支持 libm.so (math.h) 标准C数学库 libpthread.so (pthread.h) POSIX标准Linux线程库 libz.so (zlib.h) 通用压缩程序库 库操做命令: (1) nm 列出目标文件或二进制文件的全部符号 (2) ar 建立静态库和符号索引 (3) ldd 列出程序正常运行所须要的共享库,例如 # ldd test_mysql linux-gate.so.1 => (0x00c59000) libmysqlclient.so.15 => /lib/libmysqlclient.so.15 (0x009a1000) libc.so.6 => /lib/libc.so.6 (0x0038b000) libpthread.so.0 => /lib/libpthread.so.0 (0x004f8000) libcrypt.so.1 => /lib/libcrypt.so.1 (0x002f0000) libnsl.so.1 => /lib/libnsl.so.1 (0x00320000) libm.so.6 => /lib/libm.so.6 (0x004bd000) /lib/ld-linux.so.2 (0x0036d000) (4) ldconfig 和动态连接和装载工具ld.so/ld-linux.so一块儿决定位于/usr/lib和/lib下的so库所需的连接。ldconfig建立一个从实际库到so库名的符号连接。注意/etc/ld.so.cache, /etc/ld.so.conf ldconfig -p列出/etc/ld.so.cache内的库对照连接。 环境变量: 动态连接器ld.so/ld-linux.so使用一些环境变量: $LDLIBRARY_PATH : 格式相似$PATH,:分隔,非标准位置/usr/lib和/lib下的库或者/etc/ld.so.cache中没有的库,须要加入该变量才能被搜索到。 $LD_PRELOAD: 空格分隔,定义须要在最前面加载的库。也能够由/etc/ld.so.preload文件代替 静态库和共享库都是包含object文件的文件。 创建和使用静态库: (1) 把代码编译成目标文件,如gcc -c libxxx.c -o libxxx.o (2) ar: ar -rcs linxxx.a linxxx.o (3) gcc -static: gcc test.c -o test -static -L. -lxxx (4) 用file检查静态连接的可执行文件 (5) 用nm检查符号,静态连接没有未定义符号 共享库占用系统资源少(磁盘和内存),运行时根据共享连接从单个文件加载,速度快,维护方便。在运行时,ld.so/ld-linux.so把二进制文件中的符号名连接到适当的so库上。 创建和使用共享库: (1) gcc -fPIC 产生与位置无关的代码,如gcc -fPIC -g -c libxxx.c -o libxxx.o (2) gcc -shared和-soname,如gcc -g -shared -Wl,–soname, -libxxx.so -o libxxx.so.1.0.0 libxxx.o (注意-Wl,–soname, -libxxx.so 中间没有空格) (3) gcc -Wl 把参数传递给连接器ld (4) gcc -l显式连接C库 编译时指定非标准位置/usr/lib和/lib下的库的方式是用-L库目录指定。