最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決python報(bào)錯(cuò)ImportError:urllib3?v2.0?only?supports?OpenSSL?1.1.1+

 更新時(shí)間:2023年12月05日 10:21:22   作者:西京刀客  
這篇文章主要介紹了解決python報(bào)錯(cuò)ImportError:urllib3?v2.0?only?supports?OpenSSL?1.1.1+的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、問題描述

python3 安裝了requests (pip install requests

二、問題分析

說明:requests包引入了urllib3,而新版本的urllib3 需要OpenSSL 1.1.1+以上版本,否則報(bào)錯(cuò):

ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+,
currently the ‘ssl’ module is compiled with ‘OpenSSL 1.0.2k-fips 26 Jan 2017’. See: https://github.com/urllib3/urllib3/issues/2168

三、解決方法

需要升級openssl

下載編譯openssl

wget --no-check-certificate   https://www.openssl.org/source/openssl-1.1.1t.tar.gz
tar -zxvf openssl-1.1.1t.tar.gz
cd openssl-1.1.1t/
./config --prefix=/usr/local/my_openssl
make
make install
tar -zxf ./my_openssl.tar.gz -C /usr/local
echo "copy my_openssl done"
sleep 1

mv /usr/bin/openssl /usr/bin/oldopenssl
ln -s /usr/local/my_openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/my_openssl/lib/libssl.so.1.1 /usr/lib64/
ln -s /usr/local/my_openssl/lib/libcrypto.so.1.1  /usr/lib64/
echo "change openssl done"

升級openssl之后,依舊import urllib3 報(bào)錯(cuò)

如果你已經(jīng)確認(rèn)系統(tǒng)中的OpenSSL顯示為新版本,但Python仍然使用舊版本,可能是因?yàn)镻ython解釋器沒有正確鏈接到新版本的OpenSSL。

思路1: 重新編譯python

重新編譯Python是一種解決Python解釋器沒有正確鏈接到新版本OpenSSL的方法之一。這可以確保Python使用新版本的OpenSSL庫。

配置編譯選項(xiàng):打開命令行終端,切換到Python源代碼的目錄,并運(yùn)行以下命令以配置編譯選項(xiàng):

./configure --with-openssl=/path/to/openssl
  • –with-ssl:表示使用了系統(tǒng)中已安裝的 OpenSSL 庫。
  • –with-openssl:表示使用了自帶的 OpenSSL 庫。

將 /path/to/openssl 替換為新版本OpenSSL庫的安裝路徑。此選項(xiàng)告訴Python編譯器在編譯過程中使用新版本的OpenSSL。

編譯和安裝:在命令行終端中運(yùn)行以下命令以編譯和安裝重新配置的Python:

make
sudo make install

這將編譯Python源代碼并將其安裝到系統(tǒng)中。注意,在執(zhí)行sudo make install時(shí),可能需要輸入管理員密碼。

驗(yàn)證安裝結(jié)果:重新編譯和安裝完成后,你可以通過運(yùn)行以下命令來驗(yàn)證Python解釋器是否鏈接到了新版本的OpenSSL:

python -c "import ssl; print(ssl.OPENSSL_VERSION)"

使用 --with-openssl 親測可用!推薦~

思路2: 指定Python解釋器鏈接到新版本的OpenSSL,而不重新編譯Python

如果你已經(jīng)安裝了新版本的OpenSSL,并且希望指定Python解釋器鏈接到該新版本的OpenSSL,而不重新編譯Python,可以通過設(shè)置環(huán)境變量LD_LIBRARY_PATH(Linux)或DYLD_LIBRARY_PATH(macOS),將新版本的OpenSSL庫路徑添加到Python解釋器的運(yùn)行環(huán)境中。

例如,假設(shè)新版本的OpenSSL庫位于 /usr/local/ssl/lib,你可以執(zhí)行以下操作:

export LD_LIBRARY_PATH=/usr/local/ssl/lib:$LD_LIBRARY_PATH

在Python交互環(huán)境中,執(zhí)行以下代碼來查看Python中使用的OpenSSL庫的路徑:

import ssl
print(ssl.OPENSSL_VERSION)
print(ssl._ssl.__file__)

我這邊測試,無論怎么改LD_LIBRARY_PATH,一直引用的python安裝目錄下的: lib/python3.8/lib-dynload/_ssl.cpython-38-x86_64-linux-gnu.so

四、python編譯和openssl的關(guān)系?每次openssl爆漏洞,我也需要編譯升級python么?

Python與OpenSSL之間存在緊密的關(guān)系。OpenSSL是一個(gè)開源的密碼學(xué)庫,提供了實(shí)現(xiàn)SSL/TLS協(xié)議和加密算法的功能。Python的SSL模塊則是構(gòu)建在OpenSSL庫之上的,它提供了對SSL/TLS協(xié)議的支持,使得Python程序能夠進(jìn)行安全的網(wǎng)絡(luò)通信、加密解密等操作。

通常情況下,只需要升級OpenSSL本身即可,Python的SSL模塊將自動(dòng)使用最新版本的OpenSSL庫。你無需重新編譯Python,只需確保你系統(tǒng)中已經(jīng)安裝了更新后的OpenSSL庫,Python將自動(dòng)鏈接并使用該庫。

  • Python的SSL模塊是通過調(diào)用操作系統(tǒng)提供的動(dòng)態(tài)鏈接庫(或共享庫)來實(shí)現(xiàn)其功能的。這些動(dòng)態(tài)鏈接庫包含了SSL/TLS協(xié)議和加密算法的實(shí)現(xiàn)。在大多數(shù)操作系統(tǒng)中,OpenSSL庫被視為系統(tǒng)級庫,因此Python的SSL模塊會(huì)默認(rèn)鏈接到操作系統(tǒng)中已安裝的OpenSSL庫。

  • 當(dāng)你在系統(tǒng)中升級OpenSSL庫時(shí),通常會(huì)更新相應(yīng)的動(dòng)態(tài)鏈接庫文件。這意味著Python的SSL模塊可以自動(dòng)從已更新的動(dòng)態(tài)鏈接庫中加載最新版本的OpenSSL功能。

  • Python的SSL模塊在運(yùn)行時(shí)會(huì)動(dòng)態(tài)加載所需的OpenSSL函數(shù)和符號。它會(huì)查找操作系統(tǒng)的動(dòng)態(tài)鏈接庫搜索路徑,以尋找和加載正確版本的OpenSSL庫。如果新版本的OpenSSL庫存在于系統(tǒng)的動(dòng)態(tài)庫搜索路徑中,Python的SSL模塊將自動(dòng)鏈接并使用該庫。

需要注意的是,上述自動(dòng)鏈接和使用最新版本的OpenSSL庫僅適用于使用操作系統(tǒng)提供的Python分發(fā)版本。如果你使用的是自行編譯的Python,那么在編譯和安裝Python時(shí)需要確保正確地鏈接到更新后的OpenSSL庫。

如果你使用的是源代碼包,可以通過在運(yùn)行./configure命令時(shí)傳遞–with-openssl參數(shù),并指定新版本的OpenSSL庫所在的路徑來配置Python的編譯選項(xiàng)。例如:

./configure --with-openssl=/path/to/new/openssl

通過設(shè)置 LD_LIBRARY_PATH 環(huán)境變量,你可以指定 OpenSSL 庫的搜索路徑,而無需重新編譯 Python。但這種方法僅對于運(yùn)行時(shí)鏈接到 OpenSSL 的應(yīng)用程序有效,如果 Python 在靜態(tài)鏈接時(shí)已經(jīng)鏈接到舊版本的 OpenSSL,那么這種方法可能無效。

如果 Python 是在靜態(tài)鏈接時(shí)與舊版本的 OpenSSL 相關(guān)聯(lián),那么僅通過設(shè)置 LD_LIBRARY_PATH 環(huán)境變量可能無法使 Python 使用新版本的 OpenSSL。

在靜態(tài)鏈接的情況下,編譯時(shí)會(huì)將 OpenSSL 的代碼和函數(shù)嵌入到生成的可執(zhí)行文件中,而不是在運(yùn)行時(shí)動(dòng)態(tài)加載。這意味著無論設(shè)置 LD_LIBRARY_PATH 環(huán)境變量如何,Python 仍然會(huì)使用已經(jīng)嵌入的舊版本 OpenSSL 的功能。

進(jìn)入 Python 安裝目錄,查找名為 libpython*.a 的文件。例如,對于 Python 3.8,文件名可能是 libpython3.8.a。

 find / -name libpython*.a

如果你找到了這個(gè)文件,那么 Python 是靜態(tài)鏈接到 OpenSSL 的。如果沒有找到該文件,那么 Python 是在運(yùn)行時(shí)動(dòng)態(tài)鏈接到 OpenSSL 的。

如果發(fā)現(xiàn) Python 是靜態(tài)鏈接到 OpenSSL 的,那么僅通過設(shè)置 LD_LIBRARY_PATH 環(huán)境變量可能無法使 Python 使用新版本的 OpenSSL。在這種情況下,你可能需要重新編譯 Python 并鏈接到新版本的 OpenSSL,以確保 Python 使用最新的 OpenSSL 功能。

五、python怎么決定是動(dòng)態(tài)還是靜態(tài)鏈接到openssl的?

在大多數(shù)情況下,Python 是通過動(dòng)態(tài)鏈接的方式與 OpenSSL 相關(guān)聯(lián)。這意味著 Python 在運(yùn)行時(shí)會(huì)從系統(tǒng)中加載所需的 OpenSSL 動(dòng)態(tài)庫。

但是,有一些特殊情況可能導(dǎo)致 Python 靜態(tài)鏈接到 OpenSSL:

自定義編譯:如果你使用自定義的編譯選項(xiàng)或手動(dòng)編譯 Python,可能會(huì)導(dǎo)致靜態(tài)鏈接到 OpenSSL。在這種情況下,你需要檢查編譯過程中的選項(xiàng),并確認(rèn)是否啟用了靜態(tài)鏈接。

檢查 Python 編譯過程中是否啟用了靜態(tài)鏈接的選項(xiàng)

進(jìn)入 Python 安裝目錄,通常是 /usr/local/或/usr/ 中的 bin 目錄,路徑類似 /usr/local/bin/ 或 /usr/bin/

執(zhí)行以下命令來查看編譯選項(xiàng):

./python3-config --ldflags

這個(gè)命令將顯示編譯 Python 時(shí)使用的鏈接器標(biāo)志。

如果在輸出中看到了 -lssl 或 -lcrypto,則表示 Python 在編譯時(shí)啟用了 OpenSSL 鏈接。這意味著 Python 是通過動(dòng)態(tài)鏈接方式與 OpenSSL 關(guān)聯(lián),而不是靜態(tài)鏈接。

如果在輸出中看到了 -l:libssl.a 或 -l:libcrypto.a,則表示 Python 在編譯時(shí)啟用了靜態(tài)鏈接。這意味著 Python 是通過靜態(tài)鏈接方式與 OpenSSL 關(guān)聯(lián)。

確定Python到底使用了哪個(gè)OpenSSL庫

在Python交互環(huán)境中,執(zhí)行以下代碼來查看Python中使用的OpenSSL庫的路徑:

import ssl
print(ssl.OPENSSL_VERSION)
print(ssl._ssl.__file__)

這將打印出Python使用的OpenSSL版本以及實(shí)際加載的庫文件路徑。

系統(tǒng)中安裝了多個(gè)libssl庫版本。這可能導(dǎo)致Python解釋器無法正確鏈接到所需的libssl庫。

可以執(zhí)行以下命令來檢查libssl庫是否安裝:

 ldconfig -p | grep libssl

六、編譯python3.8 報(bào)錯(cuò):Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host()

編譯python3.8 報(bào)錯(cuò):Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().
LibreSSL 2.6.4 and earlier do not provide the necessary APIs, https://github.com/libressl-portable/portable/issues/381

問題分析:
我本地的openssl已經(jīng)更新了,但是還是報(bào)這個(gè)錯(cuò),甚至我使用python編譯選項(xiàng)指定我opensslssl的路徑也不行 --with-openssl=/usr/local/my_openssl/lib/

需要確認(rèn)安裝的OpenSSL是否在編譯時(shí)添加了enable-ssl3配置

./config enable-ssl3 shared --prefix=/usr/local/openssl
make
sudo make install

在編譯OpenSSL時(shí)添加enable-ssl3配置的原因是:

OpenSSL 1.1.0 版本之后,默認(rèn)禁用了SSLv3協(xié)議,只支持TLSv1.0及以上版本。但Python在構(gòu)建ssl模塊時(shí),仍然需要SSLv3的支持。所以在編譯OpenSSL時(shí)需要顯式添加enable-ssl3配置來啟用SSLv3協(xié)議。

如果不添加這個(gè)配置,編譯Python時(shí)會(huì)出現(xiàn)您遇到的錯(cuò)誤:

Could not build the ssl module! 
Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().

這是因?yàn)镻ython試圖調(diào)用OpenSSL的X509_VERIFY_PARAM_set1_host()函數(shù),但這個(gè)函數(shù)是在OpenSSL 1.0.2版本引入的。而默認(rèn)編譯的OpenSSL 1.1.0及以上版本又禁用了SSLv3,所以Python無法構(gòu)建ssl模塊。

  • 它會(huì)啟用SSLv3協(xié)議,這樣Python可以調(diào)用OpenSSL的SSLv3相關(guān)函數(shù)來構(gòu)建ssl模塊。
  • 它會(huì)構(gòu)建OpenSSL的早期兼容版本,這樣Python可以調(diào)用像X509_VERIFY_PARAM_set1_host()這樣的函數(shù)。

注意 python編譯參數(shù)的 應(yīng)該使用--with-openssl=/usr/local/openssl來指定OpenSSL的主目錄, 而不是子目錄如lib。Python的configure腳本會(huì)在該路徑下自動(dòng)搜索include子目錄和lib子目錄。

親測通過!

總結(jié)

到此這篇關(guān)于解決python報(bào)錯(cuò)ImportError:urllib3 v2.0 only supports OpenSSL 1.1.1+的文章就介紹到這了,更多相關(guān)python報(bào)錯(cuò)ImportError內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Django Sitemap 站點(diǎn)地圖的實(shí)現(xiàn)方法

    Django Sitemap 站點(diǎn)地圖的實(shí)現(xiàn)方法

    這篇文章主要介紹了Django Sitemap 站點(diǎn)地圖的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 初學(xué)者快看,Python下劃線的五個(gè)作用介紹

    初學(xué)者快看,Python下劃線的五個(gè)作用介紹

    大家好,本篇文章主要講的是初學(xué)者快看,Python下劃線的五個(gè)作用介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Python中reduce()函數(shù)的用法詳細(xì)解讀

    Python中reduce()函數(shù)的用法詳細(xì)解讀

    這篇文章主要介紹了Python中reduce()函數(shù)的用法詳細(xì)解讀,reduce函數(shù)是通過函數(shù)對迭代器對象中的元素進(jìn)行遍歷操作,但需要注意的是?reduce?函數(shù)返回的是計(jì)算的結(jié)果,而?map/filter?返回的是作用后的迭代器對象,需要的朋友可以參考下
    2023-08-08
  • python logging模塊的使用總結(jié)

    python logging模塊的使用總結(jié)

    這篇文章主要介紹了python logging模塊使用總結(jié)以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。,需要的朋友可以參考下
    2019-07-07
  • Matplotlib自定義坐標(biāo)刻度的使用示例

    Matplotlib自定義坐標(biāo)刻度的使用示例

    雖然matplotlib默認(rèn)的坐標(biāo)軸定位器與格式生成器可以滿足大部分需求,但是并非對每一幅圖都合適,本文主要介紹了Matplotlib自定義坐標(biāo)刻度的使用示例,感興趣的可以了解一下
    2023-11-11
  • Java與Python兩大幸存者誰更勝一籌呢

    Java與Python兩大幸存者誰更勝一籌呢

    Python起源于一種腳本語言,它的語法體現(xiàn)了一種可讀性的理念,具有簡單而規(guī)則的界限,鼓勵(lì)簡潔和一致的代碼布局,而Java是一種面向?qū)ο笳Z言,其吸引力和價(jià)值所在是其具有的可移植性和相對效率。下面通過本文了解下java python 誰更勝一籌
    2018-04-04
  • 使用NumPy和pandas對CSV文件進(jìn)行寫操作的實(shí)例

    使用NumPy和pandas對CSV文件進(jìn)行寫操作的實(shí)例

    今天小編就為大家分享一篇使用NumPy和pandas對CSV文件進(jìn)行寫操作的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python中高級語法糖的使用示例詳解

    Python中高級語法糖的使用示例詳解

    Python?是一門簡潔而強(qiáng)大的編程語言,具備許多高級語法糖(syntactic?sugar)功能,本文將介紹一些常見的Python高級語法糖,以及如何使用它們來提高代碼質(zhì)量和開發(fā)效率,需要的小伙伴可以參考下
    2024-01-01
  • Python實(shí)現(xiàn)的計(jì)算馬氏距離算法示例

    Python實(shí)現(xiàn)的計(jì)算馬氏距離算法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的計(jì)算馬氏距離算法,簡單說明了馬氏距離算法原理,并結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)與使用馬氏距離算法的相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • LRUCache的實(shí)現(xiàn)原理及利用python實(shí)現(xiàn)的方法

    LRUCache的實(shí)現(xiàn)原理及利用python實(shí)現(xiàn)的方法

    LruCache 是 Android 的一個(gè)內(nèi)部類,提供了基于內(nèi)存實(shí)現(xiàn)的緩存,而下面這篇文章主要給大家介紹了關(guān)于LRUCache的實(shí)現(xiàn)原理以及利用python實(shí)現(xiàn)的方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-11-11

最新評論

南漳县| 公主岭市| 鲁甸县| 林州市| 五河县| 威海市| 黄浦区| 从化市| 吕梁市| 资源县| 长海县| 上饶市| 无锡市| 永仁县| 虹口区| 婺源县| 永定县| 区。| 阳城县| 长岛县| 吉木萨尔县| 宜昌市| 抚远县| 隆安县| 南康市| 玉溪市| 余庆县| 马龙县| 寻甸| 乌鲁木齐市| 平乡县| 安顺市| 扶沟县| 恩施市| 巴南区| 兴安县| 苏尼特右旗| 长沙县| 临安市| 肥东县| 翁牛特旗|