【问题标题】:Install m2crypto on a virtualenv without system packages在没有系统包的 virtualenv 上安装 m2crypto
【发布时间】:2023-04-02 02:22:01
【问题描述】:

我在 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?

【问题讨论】:

    标签: python ubuntu virtualenv m2crypto


    【解决方案1】:

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

    M2Crypto's source 放入您的virtualenv 后,您可以尝试使用下面的diff 代码patch

    您可以通过下载源代码来执行此操作,并通过以下方式解压: 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;
    

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢,我现在没有我的ubuntu,但我稍后会试试。做起来有那么简单吗?你不觉得会有其他问题吗?
    • 谢谢,它确实有效!现在我想这取决于来自 ubuntu 或来自 m2crypto 的人来弄清楚为什么 pypi 版本不适用于 ubuntu。
    • 谢谢。我成功地从“dist-packages”复制了 M2Crypto,例如:从:/usr/lib/python2.7/dist-packages/M2Crypto 到:~/.virtualenvs/XXX/lib/python2.7/site-packages/
    • 请参阅stackoverflow.com/a/8219807/1231384。另外,不要复制整个目录,记住你可以只使用符号链接:ln -s /usr/lib/python2.7/dist-packages/M2Crypto ~/virtualenvs/XXX/lib/python2.7/site-packages/M2Crypto
    【解决方案3】:

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

    pip install --upgrade M2Crypto
    

    M2Crypto 0.22.3 已从martinpaljak's github repository 发布,而不是从原来的M2Crypto repository 发布。

    【讨论】:

    • 最简单的解决方案,应该在顶部
    【解决方案4】:

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

    pip install M2Crypto==0.22.6rc4
    

    【讨论】:

      【解决方案5】:

      有一个patch 计划用于 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-08
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多