M2Crypto 是最完整的為 Python 包裝 OpenSSL 的 RSA,DSA,DH,EC,HMACs,消息摘要,對稱密碼算法(包括AES)的一個庫工具。
而自從 M2Crypto 升級到版本 0.22.5 后,用 pip install M2Crypto 命令來安裝 M2Crypto 時總是會失敗。
在沒有升級到此版本之前,使用 pip 安裝則是沒有問題的。下面來找找原因。
系統環境:CentOS 6.7 x86
失敗關鍵字:swig
失敗現象:
swigging SWIG/_m2crypto.i to SWIG/_m2crypto_wrap.c swig -python -I/usr/include/python2.6 -I/usr/include -includeall -modern -builtin -outdir build/lib.linux-i686-2.6/M2Crypto -D__i386__ -o SWIG/_m2crypto_wrap.c SWIG/_m2crypto.i swig error : Unrecognized option -builtin Use 'swig -help' for available options. error: command 'swig' failed with exit status 1
這里有個最為明顯的錯誤提示:
swig error : Unrecognized option -builtin
這說明,系統里安裝的 swig 是沒有 -builtin 這個選項的。來看看系統裝的 swig 版本。
rpm -qa | grep swig
返回:
swig-1.3.40-6.el6.i686
是不是版本比較舊的緣故導致的呢?再來看看 swig 的幫助。
swig -help
看到其中有:
Note: ‘swig -<lang> -help’ displays options for a specific target language.
因為是涉及到 Python,換個命令來看看。
swig -python -help
返回(節選):
-buildnone – Use Py_BuildValue() to obtain Py_None (default in Windows)
注意其中的 options,果然是沒有 -builtin 這個選項的。
好吧很明顯,安裝 M2Crypto 所依賴的 swig 版本升級了,而 CentOS 默認的 swig 版本過低了。
下面來升級 swig 版本。官網最新版已經到了 3.0.7 了,就編譯安裝此版本的。
wget -O swig-3.0.7.tar.gz http://prdownloads.sourceforge.net/swig/swig-3.0.7.tar.gz tar zxf swig-3.0.7.tar.gz cd swig-3.0.7 ./configure --prefix=/usr make && make install
安裝完成后,再來看一下版本號。
swig -version
返回:
SWIG Version 3.0.7
至此,升級 swig 完成。再來看看新版本的 swig 到底有沒有 -builtin 這個選項。
swig -python -help
返回(節選):
-buildnone – Use Py_BuildValue() to obtain Py_None (default in Windows)
-builtin – Create new python built-in types, rather than proxy classes, for better performance
果然如此。既然如此,那趕緊繼續用 pip 安裝 M2Crypto 吧。
pip install M2Crypto
Boom,又出錯了。錯誤信息如下:
swigging SWIG/_m2crypto.i to SWIG/_m2crypto_wrap.c swig -python -I/usr/include/python2.6 -I/usr/include -includeall -modern -builtin -outdir build/lib.linux-i686-2.6/M2Crypto -D__i386__ -o SWIG/_m2crypto_wrap.c SWIG/_m2crypto.i /usr/include/openssl/opensslconf.h:13: Error: Unable to find 'opensslconf-i386.h' error: command 'swig' failed with exit status 1
原因是什么呢?M2Crypto 沒找到 openssl 的頭文件 opensslconf-i386.h
如果是在 x86_64 下安裝的話,會找不到 opensslconf-x86_64.h
怎么辦呢?看來是不能通過 pip 來安裝了,那我們手動來。
wget --no-check-certificate -O M2Crypto-0.22.5.tar.gz https://pypi.python.org/packages/source/M/M2Crypto/M2Crypto-0.22.5.tar.gz tar zxf M2Crypto-0.22.5.tar.gz cd M2Crypto-0.22.5 cp /usr/include/openssl/opensslconf-i386.h ./ #手動把頭文件復制過來(適用於x86) cp /usr/include/openssl/opensslconf-x86_64.h ./ #手動把頭文件復制過來(適用於x86_64) python setup.py install
好了,這下終於安裝完成了。看看成果:
pip list | grep M2Crypto
返回:
M2Crypto (0.22.5)
后來我去到 M2Crypto 的官網去看了下,已經有人跟作者反映了這個事情。
https://gitlab.com/m2crypto/m2crypto/issues/69
希望作者能在下個版本改進吧。