18

我在 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 安装 python-m2crypto 和 apt-get。我知道我可以使用系统包创建环境,但我不想这样做。

无论如何,我可以在没有系统包的情况下创建一个虚拟环境,然后使用 pip 安装 m2crypto 而不会运行到 SSLv2_method?

4

5 回答 5

31

早期版本的 M2Crypto 似乎存在回归错误。

M2Crypto 的源代码 放入您的 virtualenv 后,您可以尝试使用下面的差异代码对其进行修补。

您可以通过下载源代码来完成此操作,并通过以下方式解压: 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;
于 2012-06-17T15:55:16.807 回答
15

你可以在你的全局环境中安装这个库,然后从你的全局站点包复制到 virtualenv。

于 2012-05-11T08:18:51.980 回答
5

M2Crypto 0.22.3(pypi 中的当前版本)修复了这个问题,所以现在最简单的解决方案就是:

pip install --upgrade M2Crypto

M2Crypto 0.22.3 已从martinpaljak 的 github 存储库发布,而不是从原始M2Crypto 存储库发布

于 2014-09-11T12:53:26.017 回答
2

我对当前版本(M2Crypto-0.22.5)有同样的问题。最新的 RC 版本对我有用。

pip install M2Crypto==0.22.6rc4
于 2015-12-30T02:49:50.680 回答
0

有一个计划用于 0.26.1的补丁。

同时,您可以克隆 repo、应用补丁并从源代码安装。

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
于 2017-03-03T02:57:04.877 回答