使用OpenSSL时出现SSL后端错误

我试图用pip在virtualenv中安装pycurl,并且出现这个错误

ImportError: pycurl: libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none/other) 

我读了一些文件,说: “要解决这个问题,你需要告诉setup.py什么SSL后端使用” (来源),虽然我不知道如何做到这一点,因为我使用pip安装pycurl。

如何在使用pip安装pycurl时指定SSL后端?

谢谢

读完INSTALLATION文件之后,我可以通过设置一个环境variables来解决我的问题,并重新安装

  • 删除现有的pycurl安装

    pip uninstall pycurl

  • 导出variables与您的链接时间ssl后端(这是openssl上面)

    export PYCURL_SSL_LIBRARY=openssl

  • 然后,重新安装pycurl

    pip install pycurl

那里可能有其他的解决scheme,但是这对我来说是一个完美的virtualenvpip安装。

helloworld2013的答案是正确的,但关键是匹配pycurl所期望的SSL库。 错误将会是这样的:

pycurl:libcurl link-time ssl后端( <library> )不同于编译时ssl后端( <library>或“ none / other ”)

要解决它,你必须使用pycurl所期望的库。 在我的情况下,我的错误是“ pycurl:libcurl链接时间SSL后端( NSS )是不同于编译时SSL后端(OpenSSL) ”,所以我的修复是:

 # pip uninstall pycurl # export PYCURL_SSL_LIBRARY=nss # pip install pycurl 

使用pip 7.1,您可以将以下内容放入您的需求文件中:

 pycurl==7.19.5.1 --global-option="--with-nss" 

只需将nssreplace为相关的ssl后端库即可。

这对我工作:

 pip uninstall pycurl export PYCURL_SSL_LIBRARY=nss easy_install pycurl 

这一切都没有为我工作(注意差异是简单的easy_install vs pip):

 pip uninstall pycurl export PYCURL_SSL_LIBRARY=[nss|openssl|ssl|gnutls] pip install pycurl #xor curl -O https://pypi.python.org/packages/source/p/pycurl/pycurl-7.19.3.1.tar.gz #... python setup.py --with-[nss|openssl|ssl|gnutls] install 

使用OSX 10.13,brew安装的openSSL和virtualenv,我获得了成功:

 workon ..your-environment-here.. pip uninstall pycurl export PYCURL_SSL_LIBRARY=openssl export LDFLAGS=-L/usr/local/opt/openssl/lib;export CPPFLAGS=-I/usr/local/opt/openssl/include;pip install pycurl --compile --no-cache-dir 

你可以从这里下载tar.gz文件。 然后将其提取到一个文件夹中。 你会在那里find一个setup.py文件。 在那里运行该网站提到的命令。 例如:

 python setup.py --with-[ssl|gnutls|nss] install 

仅供参考:我试图在我的窗户上安装pycurl,但是我不能。 但在我的Linux上做到了。

我在CentOS 7上。我尝试了上述所有内容,但无法获得任何工作。 事实certificate,我需要以root用户身份运行这些程序。 因此,如果遇到问题,请以root用户身份尝试上述任何解决scheme。 举个例子,这是对我有用的东西:

 su - pip uninstall pycurl export PYCURL_SSL_LIBRARY=[nss|openssl|ssl|gnutls] pip install pycurl 

当然,所有关于作为root用户运行的平常声明都适用。

注意:上面代码中的[nss | openssl | ssl | gnutls]表示select一个。 提出原问题的人会selectopenssl。 在我的个案中,我select了nss。 你的错误信息应该告诉你做出select。

我在OS X上运行这个和上面的一些解决scheme不工作。 与Edward Newell的评论类似, PYCURL_SSL_LIBRARYvariables似乎已被完全忽略。
进一步阅读PycURL安装文档揭示了以下内容:

点可能会重新安装它以前编译的软件包,而不是用新指定的选项重新编译pycurl

因此,我不得不迫使它编译:

pip install --compile pycurl

这在很多情况下都适用。 但是,我遇到了一些继续忽略这个variables的系统,所以,类似于maharg101的回答 ,我使用了可以通过pip设置的安装选项:

pip install pycurl --global-option="--with-[ssl|gnutls|nss]"

在方括号内select三个选项之一。 注意可用的选项是ssl不是 openssl 。 如果你指定--with-openssl你会得到一个错误。 另外请注意,如果您正在搞乱PYCURL_SSL_LIBRARYvariables并将其切换为时髦的值以查看将会发生什么,那么最后一个命令肯定会捕获它,并且如果该值被设置但是无效则抛出错误。

我有这个问题好几天了。 最后在这里(主要是亚历山大Tyapkov)的其他答案的帮助下,我得到了AWS Elastic Beanstalk的工作。

手动安装(使用SSH连接):

 sudo pip uninstall pycurl curl -O https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.tar.gz sudo pip install pycurl-7.43.0.tar.gz --global-option="--with-nss" 

重要提示:请注意,您必须确保您使用的是Python和PIP的正确版本,否则您可能正在为Python 2.x和v3.x编译它。

在Elastic Beanstalk中自动安装:

 files: "/usr/local/share/pycurl-7.43.0.tar.gz" : mode: "000644" owner: root group: root source: https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.tar.gz commands: 01_download_pip3: # run this before PIP installs requirements as it needs to be compiled with OpenSSL command: 'curl -O https://bootstrap.pypa.io/get-pip.py' 02_install_pip3: # run this before PIP installs requirements as it needs to be compiled with OpenSSL command: 'python3 get-pip.py' 03_pycurl_uninstall: # run this before PIP installs requirements as it needs to be compiled with OpenSSL command: '/usr/bin/yes | sudo pip uninstall pycurl' 04_pycurl_download: # run this before PIP installs requirements as it needs to be compiled with OpenSSL command: 'curl -O https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.tar.gz' 05_pycurl_reinstall: # run this before PIP installs requirements as it needs to be compiled with OpenSSL command: 'sudo pip install pycurl-7.43.0.tar.gz --global-option="--with-nss"' container_commands: 09_pycurl_reinstall: # run this before PIP installs requirements as it needs to be compiled with OpenSSL # the upgrade option is because it will run after PIP installs the requirements.txt file. # and it needs to be done with the virtual-env activated command: 'source /opt/python/run/venv/bin/activate && pip3 install /usr/local/share/pycurl-7.43.0.tar.gz --global-option="--with-nss" --upgrade' 

我有这个问题,因为我试图在Elastic Beanstalk中用Django 1.10configurationCelery 4。 如果这是你的情况, 我写了一个完整的博客文章 。

重新安装curl

我试过这个讨论的每一个build议,但没有人为我工作。 作为解决scheme,我重新安装了curl和curlib。 之后,我可以在环境中安装带有ssl支持的pycurl。

开始时:

'PycURL / 7.43.0 libcurl / 7.47.0 GnuTLS / 3.4.10 zlib / 1.2.8 libidn / 1.32 librtmp / 2.3'

第1部分.Re /用pip安装

首先,我已经使用pip从virtualenv中删除了pycurl,正如之前的回答:

 pip uninstall pycurl export PYCURL_SSL_LIBRARY=openssl pip install pycurl --global-option="--with-openssl" 

这里的想法是,软件包被caching,我们只是用openssl选项重新安装它。

我也尝试使用pip重新编译pycurl:

 pip install pycurl --compile pycurl --no-cache 

..但运行后有相同的错误:

 python import pycurl pycurl.version 

importError:pycurl:libcurl link-time ssl后端( gnutls )不同于编译时的ssl后端( openssl

第2部分。从tar安装

之前的方法没有工作后,我决定从tar安装pycurl:

 curl -O https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.tar.gz sudo tar -xzvf pycurl-7.43.0.tar.gz cd pycurl-7.43.0/ sudo python setup.py --with-ssl install 

它在全球安装了pycurl,但不在virtualenv。 我也没有检查是否安装SSL支持,但认为仍然没有ssl。

第3部分:重新安装curl和curllib

最后我明白,pycurl没有正常安装到环境中,因为全局curl和libcurl是用gnutls编译的。

开始之前请检查:

 curl-config --configure 

其中一条输出线将是

'–without-ssl''–with-gnutls'

重新编译它:

首先去除curl:

 sudo apt-get purge curl 

安装curl所需的任何构build依赖项

 sudo apt-get build-dep curl 

获取最新(截至2016年12月20日)libcurl

 mkdir ~/curl wget http://curl.haxx.se/download/curl-7.51.0.tar.bz2 tar -xvjf curl-7.51.0.tar.bz2 cd curl-7.51.0 

通常从源代码构build应用程序的步骤

 ./configure ./make sudo make install 

如果openssl正确安装,那么configuration会自动find它。 输出将是:

curl版本:7.51.0
主机设置:x86_64-pc-linux-gnu
安装前缀:/ usr / local
编译器:gcc
SSL支持: 启用(OpenSSL)

解决C级lib位置高速caching(“共享库高速caching”)的任何问题

 sudo ldconfig 

现在尝试在环境中重新安装pycurl:

 curl -O https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.tar.gz pip install pycurl-7.43.0.tar.gz --global-option="--with-openssl" 

结果应该是:

 python import pycurl pycurl.version 

'PycURL / 7.43.0 libcurl / 7.51.0 OpenSSL / 1.0.2g zlib / 1.2.8 librtmp / 2.3'

不知道这是因为在virtualenv运行,但在CentOS 7这些解决scheme不适合我; 当我重新安装时,编译的对象仍然从caching目录中抓取。 如果在尝试其他解决scheme后遇到同样的问题,请尝试以下操作:

 pip uninstall pycurl export PYCURL_SSL_LIBRARY=[nss|openssl|ssl|gnutls] pip install pycurl --no-cache-dir 
 pip install -U pip if [ "$(curl --version | grep NSS 2>/dev/null)" ]; then pip install --compile --install-option="--with-nss" pycurl else pip install --compile --install-option="--with-openssl" pycurl fi 

对于Python 2.7

 sudo apt-get install build-essential libssl-dev libffi-dev python-dev 

对于python 3.5还安装下一个:

 sudo apt-get install python3.5-dev 

从pypi下载最新的pycurl-7.43.0.tar.gz(md5)来源https://pypi.python.org/pypi/pycurl/7.43.0#downloads并运行下一个命令:;

 python setup.py --with-openssl install 

你也可以进入python环境:

 (test_env)user@pc:~/Downloads/pycurl-7.43.0$ python setup.py --with-openssl install 

我遇到了这个问题, Sanket Jagtap的答案为我工作。 我试着答案最多的答案,但它没有奏效。

我的openssl旧版本是1.0.1t,我认为重新安装openssl可能会解决这个问题。

 --- pycurl's openssl backend time.... 

我重build了最新的openssl并尝试了这个答案。 看一下这个。

 pip install --compile --install-option="--with-openssl" pycurl 

这对我有效。

我build议我们应该重新安装我们的openssl for try ..

错误:

importError:pycurl:libcurl link-time ssl backend(openssl)与编译时的ssl后端(none / other)是不同的

这工作对我来说,Mac 10.13,python3.5,pycurl导入工作后,像这样安装

 pip3 uninstall pycurl; pip3 install --compile --install-option="--with-openssl" pycurl