我试图使用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后端?
由于
答案 0 :(得分:102)
在阅读了他们的INSTALLATION文件之后,我能够通过设置环境变量并重新安装来解决我的问题
删除现有的pycurl
安装
pip uninstall pycurl
使用您的链接时间ssl后端导出变量(上面是openssl)
export PYCURL_SSL_LIBRARY=openssl
然后,重新安装pycurl
pip install pycurl
可能还有其他解决方案,但这对virtualenv
和pip
安装完全有效。
答案 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的方法:
重新安装curl库以使用OpenSSL而不是SecureTransport
brew install curl --with-openssl
使用正确的构建时环境和路径安装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中工作的方式:
答案 11 :(得分:2)
我尝试了这次讨论的每一个建议,但没有人为我工作。作为解决方案,我重新安装了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"