使用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,但是这对我来说是一个完美的virtualenv
和pip
安装。
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_LIBRARY
variables似乎已被完全忽略。
进一步阅读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_LIBRARY
variables并将其切换为时髦的值以查看将会发生什么,那么最后一个命令肯定会捕获它,并且如果该值被设置但是无效则抛出错误。
我有这个问题好几天了。 最后在这里(主要是亚历山大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