使用OpenSSL时SSL后端错误


87

我试图使用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后端?

谢谢


1
您的操作系统是什么?
Evgenii

Answers:


121

读取他们的INSTALLATION文件后,我可以通过设置环境变量解决问题并重新安装

  • 删除现有pycurl安装

    pip uninstall pycurl

  • 带有链接时间ssl后端的导出变量(上面的openssl)

    export PYCURL_SSL_LIBRARY=openssl

  • 然后,pycurl没有缓存的情况下重新安装

    pip install pycurl --no-cache-dir

那里可能还有其他解决方案,但这在我virtualenvpip安装上非常适合我。


2
谢谢,PYCURL_SSL_LIBRARY=openssl完美的作品!
thnee 2014年

对于mac os x用户:如果您使用fish console而不是bash,请不要记得使用set -x PYCURL_SSL_LIBRARY openssl代替。export PYCURL_SSL_LIBRARY=openssl
Serge

13
pip install pycurl --no-cache-dir
Shuguang Yang

谢谢。我已经研究了许多解决此问题的方法。此解决方案是第一次使用。
Matt Setter


77

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

pycurl:libcurl链接时ssl后端(<library>)与编译时ssl后端(<library>或“ none / other ”)不同

要修复它,您必须使用pycurl期望的库。以我为例,我的错误是“ pycurl:libcurl链接时ssl后端(nss)与编译时ssl后端(openssl)不同”,所以我的解决方法是:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=nss
pip install pycurl

1
辉煌的。这应该获得更多的选票。原始答案适用于某些机器。根据您的平台,这是一种更通用的修复方法。
Nishant 2014年

6
嗯,这在Mac上对我不起作用。似乎PYCURL_SSL_LIBRARY被完全忽略了。即使echo PYCURL_SSL_LIBRARY给出,编译时ssl后端对我来说始终是“(无/其他)” openssl
爱德华·纽厄尔

1
像@EdwardNewell一样,尽管我确实为PYCURL_SSL_LIBRARY指定了nss,但该修补程序在Scientific Linux(Rhel)上对我不起作用,后端仍然保留(无/其他)
Yondaime008

3
在Mac上,我删除pycurl并安装了以下标志:pip install --global-option="--with-openssl" --global-option=build_ext --global-option="-L/usr/local/opt/openssl/lib" --global-option="-I/usr/local/opt/openssl/include" pycurl
eigenein

2
这有效,但只能使用以下选项:pip install pycurl --compile --no-cache-dir在CentOS 7.3上。
Robert Yi

51

使用OSX 10.13,经过酿酒安装的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

4
是的,在MacOS 10.13.1(High Sierra)上,就成功了!非常感谢!为了重新安装openssl:brew reinstall openssl
Denis Arnaud

1
我解决了我的问题。谢谢:)
JeongjinKim

1
修复了Mac OSX 10.13.4上的问题!谢谢。
user1192748'4

1
谢谢!还解决了我的问题。Mac OSX 10.13.4
史蒂文·丘奇

2
达里尔很遗憾听到这个消息!在Mojave上,它再次对我有用,所以我不确定发生了什么。
迈克尔·威尔逊,

24

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

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

只需将nss替换为相关的ssl后端库即可。


1
此解决方案比导出var并重新安装更好,因为它可以在requirements.txt文件中共享,并且不必按用户重复。
dfarrell07年

1
在CentOS 7上,导出对我而言不起作用,但是设置全局选项可以。谢谢!
亚伦·阮

我必须将您的解决方案与@Michael Wilson的解决方案结合起来,才能使其在macOS上运行。看起来像是一个加密货币
kip2

20

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
    

2
在High Sierra上为我工作(使用virtualenv)。
djangoat

1
是! 也看到这篇文章cscheng.info/2018/01/26/...
somecallitblues

在High Sierra上为我工作(使用virtualenv),但我必须删除--user标志
user495732 Why Me Me 18-11-11

非常感谢你!!那是非常有用的。运行High Sierra并花几个小时,这是唯一
Alessandro

当我--user如上所述使用旗帜时,我得到了:Can not perform a '--user' install. User site-packages are not visible in this virtualenv.
Daryl Spitzer

19

这为我工作:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=nss
easy_install pycurl

这些都不适合我(请注意,区别只是easy_install与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

1
easy_install选项是唯一可行的选项。我不明白为什么这么复杂。我需要export PYCURL_SSL_LIBRARY=openssl。我的一个报告编译后的库为“ none / other”。
CMCDragonkai '16

只是碰到了这个问题,这个解决方案是唯一对我有用的解决方案。
Boudewijn Aasman '17年

2
以我的经验,pip不能完全删除与操作系统一起安装的pucurl的旧版本(在我的情况下为Centos7.2)。Pip没有触摸早期版本中的/usr/lib64/python2.7/site-packages/pycurl.so和egg-info文件。另一方面,Easy_install除了将pycurl鸡蛋放入站点包装中之外,还清除了这些内容。
sokhaty

gh,尝试了以上所有方法,但没有效果。这为我工作,当我原始的错误消息是```导入错误:pycurl:libcurl的链接时SSL后端(OpenSSL的)是由编译时SSL后端不同(无/其他)```
詹姆斯McCormac

10

我有这个问题好几天了。最终,在这里的其他答案(主要是Alexander 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.10配置Celery 4。如果是这样,我就写了一篇完整的博客文章


谢谢 这些东西可能很烦人,尤其是因为eb配置文件看起来非常多变,并且从不给您带来合理的错误(包括格式问题)
Ian

我upvoted这个答案,因为它在AWS上安装pycurl时帮了我很多,解决了类似的问题:stackoverflow.com/questions/51019622/...
格雷格·霍尔斯特

8

我使用的是CentOS7。我尝试了以上所有方法,但无济于事。事实证明,我需要以root用户身份运行这些文件。因此,如果遇到问题,请以root用户身份尝试上述任何解决方案。例如,这对我有用:

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

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

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

2019编辑:执行asudo pip install可能会导致机器的系统Python安装出现问题。也许尝试在Python虚拟环境中工作并在其中安装软件包。如果那不起作用,我回答中的sudo技巧可能是要考虑的最后一个选项之一。


5

您可以从此处下载tar.gz文件。然后将其解压缩到一个文件夹中。您将在此处找到setup.py文件。在该站点提到的地方运行命令。例如:

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

仅供参考:我尝试在Windows上安装pycurl,但没有。但这是在我的Linux上完成的。


感谢您的答复,但这仅对我有效,如果我不通过virtualenv和pip进行安装
helloworld2013 2014年

@Sabuj要在Windows上安装pycurl,请使用此出色网站上提供的安装程序之一:lfd.uci.edu/~gohlke/pythonlibs/#pycurl
Adam

4

我在OS X上运行它,并且上述某些解决方案无法正常工作。与Edward Newell的评论相似,该PYCURL_SSL_LIBRARY变量似乎已被完全忽略。
进一步阅读PycURL安装文档后发现:

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

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

pip install --compile pycurl

这适用于许多情况。但是,我确实遇到了几个继续忽略该变量的系统,因此,类似于maharg101的answer,我求助于通过pip可以这样设置的安装选项:

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

在其中选择方括号内的三个选项之一。请注意,可用选项是ssl不是 openssl。如果指定--with-openssl,则会出现错误。还要注意,如果您正在弄乱该PYCURL_SSL_LIBRARY变量并将其切换为时髦的值以查看会发生什么,那么如果设置了该值但该命令无效,则最后一条命令一定会捕获该变量并引发错误。


1
首先卸载pycurl,pip install pycurl --global-option="--with-nss"对我有用 。记录下来,我的错误是ImportError: pycurl: libcurl link-time ssl backend (nss) is different from compile-time ssl backend (openssl)
ahyong 2015年

由于@ahyong全局选项招工作对我来说,虽然我试图同时从焦油安装,它具有画中画的工作,但不能与setup.py怪异...
Yondaime008

4

重新安装curl

在这次讨论中,我尝试了所有建议,但没有人为我工作。作为解决方案,我重新安装了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部分。使用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链接时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-nutl'

要重新编译它:

首先去除卷曲:

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会自动找到它。输出将是:

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

解决C级库位置缓存(“共享库缓存”)的所有问题

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'


3

对于在macOS Mojave上的PyCharm CE内部存在问题的任何人,这就是我如何在venv中工作的方式:

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

PyCharm Project Interpreter屏幕截图


1
在macOS Mojave上,我需要运行brew重新安装openssl,然后进行pip安装pycurl == 7.43.0.1 --install-option =-with-openssl --install-option =-openssl-dir = / usr / local / opt / openssl
user495732 Why Me

2

这为我工作:

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


2

我在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中都对我有用。


1

不知道这是否是因为在virtualenv中运行,但是在CentOS 7上,这些解决方案对我不起作用。重新安装时,仍从缓存目录中获取已编译的对象。如果在这里尝试其他解决方案后遇到相同的问题,请尝试以下操作:

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

同样,在CentOS 7上,直到我添加了该--no-cahe-dir选项后它才起作用。只是想进一步提到,它仅在su -@alfonso建议的情况下才在root下成功运行。做的sudo pip3 ...还不够好。可能需要拾取环境变量。
Nagev

1

错误:

ImportError:pycurl:libcurl链接时ssl后端(openssl)与编译时ssl后端(无/其他)不同

这对我有用,Mac 10.13,python 3.5,pycurl导入在安装后像这样工作

pip3 uninstall pycurl;

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

在High Sierra上的Python 2.7.10中,这也对我有效。
skyler

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

当然,我花了很多时间使它生效,我不得不说这很烦人。玩得开心!!
Whitebear

1

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命令使用的全局选项。


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

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

0

我遇到了这个问题,Sanket Jagtap的答案对我有用。我尝试了投票最多的答案,但是没有用。

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

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

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

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

这对我有用。

我建议我们应该重新安装我们的openssl以进行尝试。


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


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

0

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

原始答案已发布在此页面上


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

pip install pycurl --global-option="--with-openssl"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.