>>>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庫目錄指定。