我在Ubuntu中创建了一个没有使用python的virtualenv系统软件包的虚拟环境并安装了m2crypto,但是当我执行shell并尝试导入M2Crypto时,我收到以下错误:
ImportError: /home/imediava/.virtualenvs/myenv/local/lib/python2.7/site-
packages/M2Crypto/__m2crypto.so: undefined symbol: SSLv2_method
从环境外部我遇到了同样的问题,除非从ubuntu我用apt-get安装python-m2crypto。我知道我可以使用系统包创建环境,但我不想这样做。
无论如何我可以在没有系统软件包的情况下创建虚拟环境,然后使用pip安装m2crypto而不进入SSLv2_method?
答案 0 :(得分:31)
早期版本的M2Crypto似乎存在回归错误。
在您的virtualenv中放置M2Crypto's source后,您可以尝试patch使用下面的diff代码。
您可以通过下载源代码来解决此问题,通过以下方式解压缩:
tar -xzf M2Crypto-0.21.1.tar.gz
这应创建包含M2Crypto-0.21.1
目录
SWIG
在SWIG
中,您会找到_ssl.i
,这是要修补的文件。在同一目录中创建一个名为_ssl.i.patch
的文件,例如使用nano编辑器并将下面列出的完整差异代码粘贴到其中。
接下来发出patch _ssl.i _ssl.i.patch
命令将补丁合并到代码中。 (之后,如果需要,您可以删除补丁文件。)
最后发出命令:
python setup.py build
接下来是:
python setup.py install
手动安装。
差异代码:
--- SWIG/_ssl.i 2011-01-15 20:10:06.000000000 +0100
+++ SWIG/_ssl.i 2012-06-17 17:39:05.292769292 +0200
@@ -48,8 +48,10 @@
%rename(ssl_get_alert_desc_v) SSL_alert_desc_string_long;
extern const char *SSL_alert_desc_string_long(int);
+#ifndef OPENSSL_NO_SSL2
%rename(sslv2_method) SSLv2_method;
extern SSL_METHOD *SSLv2_method(void);
+#endif
%rename(sslv3_method) SSLv3_method;
extern SSL_METHOD *SSLv3_method(void);
%rename(sslv23_method) SSLv23_method;
答案 1 :(得分:15)
您可以在全局环境中安装此lib,然后从全局站点包复制到virtualenv。
答案 2 :(得分:5)
M2Crypto 0.22.3(pypi中的当前版本)修复了这个问题,所以现在最简单的解决方案就是:
pip install --upgrade M2Crypto
M2Crypto 0.22.3已从martinpaljak's github repository发布,而不是从原M2Crypto repository发布。
答案 3 :(得分:2)
我当前版本遇到了同样的问题(M2Crypto-0.22.5)。最新的RC版本对我有用。
pip install M2Crypto==0.22.6rc4
答案 4 :(得分:0)
有一个patch定为0.26.1。
与此同时,您可以克隆存储库,应用补丁并从源代码安装。
git clone https://gitlab.com/m2crypto/m2crypto.git
(
cd m2crypto
git checkout 0.25.1
curl 'https://gitlab.com/m2crypto/m2crypto/merge_requests/117.diff' | git apply -v
)
pip install -U m2crypto