使用OpenSSL时SSL后端错误

时间:2014-01-13 16:33:46

标签: python curl virtualenv pip pycurl

我试图使用pip在virtualenv中安装pycurl,我收到了这个错误

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

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

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

由于

26 个答案:

答案 0 :(得分:102)

在阅读了他们的INSTALLATION文件之后,我能够通过设置环境变量并重新安装来解决我的问题

  • 删除现有的pycurl安装

    pip uninstall pycurl

  • 使用您的链接时间ssl后端导出变量(上面是openssl)

    export PYCURL_SSL_LIBRARY=openssl

  • 然后,重新安装pycurl

    pip install pycurl

可能还有其他解决方案,但这对virtualenvpip安装完全有效。

答案 1 :(得分:69)

helloworld2013的答案是正确的,但关键是匹配pycurl期望的SSL库。错误将类似于:

pycurl:libcurl link-time ssl后端(&lt; library&gt; )与编译时ssl后端不同(&lt; library&gt; 或&#34; < EM>无/其他&#34)

要修复它,你必须使用pycurl所期望的库。就我而言,我的错误是&#34; pycurl:libcurl link-time ssl后端( nss )与编译时ssl后端(openssl)不同&#34 ;,所以我的修复是:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=nss
pip install pycurl

答案 2 :(得分:45)

使用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

答案 3 :(得分:23)

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

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

只需用相关的ssl后端库替换nss。

答案 4 :(得分:19)

这对我有用:

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

答案 5 :(得分:16)

在Mac OS High Sierra更新后修复pycurl的方法:

  1. 重新安装curl库以使用OpenSSL而不是SecureTransport

    brew install curl --with-openssl
    
  2. 使用正确的构建时环境和路径安装pycurl

    export PYCURL_SSL_LIBRARY=openssl
    pip uninstall pycurl 
    pip install --no-cache-dir --global-option=build_ext --global-option="-L/usr/local/opt/openssl/lib" --global-option="-I/usr/local/opt/openssl/include" --user pycurl
    

答案 6 :(得分:7)

我在CentOS 7上。我尝试了上述所有内容并且无法正常工作。事实证明我需要以root用户身份运行它们。因此,如果您遇到问题,请以root用户身份尝试上述任何解决方案。举个例子,这对我有用:

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

当然,所有关于以root用户身份运行的免责声明都适用。

注意:上面代码中的[nss | openssl | ssl | gnutls]表示选择一个,不包括方括号或管道。问原问题的人会选择openssl。在我的特殊情况下,我选择了nss。您的错误消息应该告诉您要做出哪个选择。

答案 7 :(得分:7)

我有这个问题好几天了。最后在这里的其他答案(主要是亚历山大·泰普科夫)的帮助下,我让它为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.10配置Celery 4。如果是这种情况,I wrote a full blog post about it

答案 8 :(得分:5)

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

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

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

答案 9 :(得分:4)

我在OS X上运行此操作,上面的一些解决方案无效。与Edward Newell's comment类似,PYCURL_SSL_LIBRARY变量似乎完全被忽略了 进一步阅读PycURL installation doc揭示了以下内容:

  

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

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

pip install --compile pycurl

这适用于许多情况。但是,我确实碰到了一些继续忽略变量的系统,所以类似于maharg101's answer,我使用了通过pip设置的安装选项,如下所示:

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

您可以在方括号内选择三个选项之一。请注意,可用选项为ssl openssl。如果您指定--with-openssl,则会收到错误消息。另请注意,如果您正在弄乱PYCURL_SSL_LIBRARY变量并将其切换到质朴的值以查看会发生什么,最后一个命令肯定会捕获它并在设置值但无效时抛出错误。

答案 10 :(得分:2)

适用于在macOS上的PyCharm CE内部有问题的任何人 莫哈韦沙漠(mojave),这就是我在venv中工作的方式:

  • 指定版本:7.43.0.1
  • 选项:--install-option =-with-openssl --install-option =-openssl-dir = / usr / local / opt / openssl

PyCharm Project Interpreter screen shot

答案 11 :(得分:2)

重新安装curl

我尝试了这次讨论的每一个建议,但没有人为我工作。作为解决方案,我重新安装了curl和curlib。之后,我能够在环境中安装带有ssl支持的pycurl。

开始时:

  

&#39; PycURL / 7.43.0 libcurl / 7.47.0 GnuTLS / 3.4.10 zlib / 1.2.8 libidn / 1.32   librtmp / 2.3&#39;

第1部分.Re /使用pip安装

首先,我已经使用pip从virtualenv中删除了pycurl,如前面建议的那样:

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

这里的想法是包被缓存了,我们只是用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

其中一个输出行将是

  

&#39; - 无需-SSL&#39; &#39; - 与-GNUTLS&#39;

重新编译:

首先删除curl:

sudo apt-get purge curl

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

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

从源

构建应用程序的常用步骤
./configure
./make
 sudo make install

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

  

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

解决任何C级lib位置缓存问题(&#34;共享库缓存&#34;)

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
  

&#39; PycURL / 7.43.0 libcurl / 7.51.0 OpenSSL / 1.0.2g zlib / 1.2.8 librtmp / 2.3&#39;

答案 12 :(得分:1)

错误:

  

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

这对我有用,Mac 10.13,python 3.5,pycurl import在安装后像这样

pip3 uninstall pycurl;

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

答案 13 :(得分:1)

我在macOS 10.13上尝试了所有操作,但均未成功。然后我发现https://gist.github.com/webinista/b4b6a4cf8f158431b2c5134630c2cbfe有效:

brew install curl --with-openssl
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

这在不使用virtualenv时以及在virtualenv内都对我有用。

答案 14 :(得分:1)

这对我有用:

  

pip install --compile --install-option =“-with-openssl” pycurl

答案 15 :(得分:1)

长时间坚持下去之后,我发现自从OS X 10.11 El Capitan以来苹果停止了包括OpenSSL标题。 如何解决?

1) brew install openssl

2) echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile (or .zshrc for zsh, etc)

3) pip uninstall pycurl

4) pip install --install-option="--with-openssl" --install-option="--openssl-dir=/usr/local/opt/openssl" pycurl

答案 16 :(得分:1)

不确定这是因为在virtualenv中运行,但在CentOS 7上这些解决方案对我来说并不适用;当我重新安装时,编译的对象仍然从缓存目录中被抓取。如果您在此处尝试其他解决方案后遇到同样的问题,请尝试以下操作:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=[nss|openssl|ssl|gnutls]
pip install pycurl --no-cache-dir

答案 17 :(得分:0)

以下为Python3.6工作

MacOS High-Sierra

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

CentOS 7

sudo pip3 uninstall pycurl
sudo pip3 install --compile --install-option="--with-nss" pycurl

答案 18 :(得分:0)

我遇到了这个问题,Sanket Jagtap's answer为我工作。我用最多的选票答案尝试了答案但是没有用。

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

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

我重建了最新的openssl并尝试了this回答。看看这个。

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

这对我有用。

我建议我们应该重新安装我们的openssl试试..

答案 19 :(得分:0)

此链接总结了错误发生的原因,并提供了解决问题的明确指示。

https://cscheng.info/2018/01/26/installing-pycurl-on-macos-high-sierra.html

对我来说,问题发生在我从El升级到High-Sierra时 队长。

答案 20 :(得分:0)

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

答案 21 :(得分:0)

对于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 https://pypi.python.org/pypi/pycurl/7.43.0#downloads下载最新的pycurl-7.43.0.tar.gz(md5)来源 并运行下一个命令:

python setup.py --with-openssl install

你也可以进入python环境:

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

答案 22 :(得分:0)

amazonlinux上的相同问题-已解决
在基于amazonlinux创建docker映像,安装python3.7并添加pycurl模块时遇到了这个问题。 除pycurl外,其他所有python模块均已正确安装。 在尝试了与该问题相关的线程中提出的许多解决方案后,我终于通过使用以下命令安装所有组件来解决了我的问题。
yum -y install python3 python3-devel gcc libcurl-devel aws-cli openssl-static.x86_64
然后使用以下命令安装其他模块,如psycopg2-binary,requests,certifi: pip3 install --user --no-cache-dir -r requirements.txt

最后使用以下命令安装pycurl模块:

pip3 install --user --global-option="--with-openssl" --no-cache-dir pycurl
并在此处传递openssl全局选项。 在我的情况下,静态库 openssl-static.x86_64 的安装解决了该问题,因为它使用了第二个pip3命令使用的全局选项。

答案 23 :(得分:0)

FWIW,我遇到了很多问题,无法通过AWS Elastic Beanstalk进行此工作,最后终于可以使用:

packages:
  yum:
    openssl-devel: []
    libcurl-devel: []

container_commands:
  # Reinstall PyCurl with correct ssl backend
  05_reinstall_pycurl:
    command: |
      pip install --upgrade pip
      pip uninstall -y pycurl
      pip install --global-option='--with-openssl' pycurl

答案 24 :(得分:0)

最近在升级Django项目时,我遇到了类似的错误。但是这次设置环境变量无效。因此,我必须设置两个环境变量export PYCURL_SSL_LIBRARY=openssl并传递标志--global-option="with-openssl"

原始答案已发布在此page

答案 25 :(得分:-1)

export CPPFLAGS=-I/usr/local/opt/openssl/include
export LDFLAGS=-L/usr/local/opt/openssl/lib

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