前情提要
我在之前給 python3.10 安裝 ssl 模塊后以為該步驟 “對于 python3.6、python3.8 應(yīng)該同樣適用?!?。今天晚上我嘗試給服務(wù)器安裝一個帶 ssl 模塊的 python3.8 的時候,照著之前安裝 3.10 的方案來,然后失敗了-_-||。又折騰了一下,發(fā)現(xiàn) 3.8 和 3.10 的配置腳本是有區(qū)別的,不能一概而論,本文總結(jié)了一下 3.8 如何正確的編譯安裝 python 的 openssl 模塊及其原理,以及 3.8 和 3.10 配置腳本的區(qū)別。
安裝 openssl-1.1.1
- wget https://www.openssl.org/source/openssl-1.1.1n.tar.gz --no-check-certificate 下載openssl1.1.1
- tar zxf openssl-1.1.1n.tar.gz 解壓
- cd openssl-1.1.1n
- ./Configure --prefix=/usr/local/openssl 設(shè)置安裝目錄 可以自定義 但是要記住,后面會用到
- make -j && make install 編譯并安裝
- 將 /usr/local/openssl/lib 路徑添加到系統(tǒng)動態(tài)庫查找路徑中,在 home 目錄下的 .bashrc 文件最后面添加下面這一行
export LD_LIBRARY_PATH=/usr/local/openssl/lib:$LD_LIBRARY_PATH
- souce .bashrc 立即生效
重新編譯安裝 python3.8
- 切換到 python3.8 解壓包目錄
- 已經(jīng)編譯過的可以先 make clean 清理一下
- yum install libffi-devel -y 安裝 libffi-devel ,這個是為了 _ctypes 模塊
- ./configure --prefix=/usr/local/python3 --with-openssl=/usr/local/openssl --with-ssl-default-suites=openssl --with-system-ffi
- make -j && make install
到這應(yīng)該安裝成功了,如果還有問題的話留言討論吧-_-||
-rpath 編譯選項介紹
-rpath 是 gcc 的一個編譯選項,用于指定程序運(yùn)行時動態(tài)鏈接庫的搜索路徑。當(dāng)程序運(yùn)行時需要動態(tài)鏈接庫時,系統(tǒng)會在指定的路徑中搜索動態(tài)鏈接庫。
例如,假設(shè)有一個程序 a.out,它需要動態(tài)鏈接庫 libfoo.so,而 libfoo.so 位于 /usr/local/lib 目錄下,那么可以使用以下命令編譯程序:
gcc -o a.out a.c -L/usr/local/lib -lfoo -Wl,-rpath=/usr/local/lib
其中,-L 選項指定編譯器在編譯時搜索庫文件的路徑,-l 選項指定需要鏈接的庫文件名。-Wl,-rpath=/usr/local/lib 選項指定程序運(yùn)行時搜索動態(tài)鏈接庫的路徑。
這樣,當(dāng)程序 a.out 運(yùn)行時,系統(tǒng)會在 /usr/local/lib 目錄下搜索 libfoo.so 動態(tài)鏈接庫。
python3.8 跟 python3.10 的區(qū)別
查看 python3.8 配置腳本關(guān)于 openssl 的幫助信息
查看 python3.10.3 配置腳本關(guān)于 openssl 的幫助信息
python3.10.3 中多出來的這個選項是說是否在 gcc 編譯的時候傳遞 -rpath 選項給編譯器,所以可以按我這篇文章中的做法處理。
python3.8 的配置腳本沒有這個選項,但是他編譯過程中又查找的是名為 libssl.so 的動態(tài)庫。這時候我們不能傳遞 -rpath=/usr/local/openssl/lib, 只能采取其他辦法,想來這也是 3.10 新增選項的原因。
那要怎么解決這個問題呢,我想到有四種解決方案:
-
方法一 屬于奇技淫巧,將動態(tài)庫文件名實(shí)際指向靜態(tài)庫文件,即 ln -s libxxx.a libxxx.so,這樣即使沒有 -rpath 選項,也沒關(guān)系了,因?yàn)楦?python 編譯鏈接的是靜態(tài)庫,而靜態(tài)庫的路徑已經(jīng)由 --with-openssl=/usr/local/openssl 選項指定了。(不推薦)
-
方法二 可以修改 python 的編譯腳本,強(qiáng)行指定 -rpath,這種做法和官方 3.10 做的效果一樣。(不推薦)
-
方法三 在系統(tǒng)的動態(tài)庫默認(rèn)搜索路徑下創(chuàng)建一個指向 /usr/local/openssl/lib/ 下兩個需要的動態(tài)庫的軟鏈接。(不推薦)
Linux系統(tǒng)默認(rèn)的C動態(tài)庫搜索目錄包括以下幾個:/lib /usr/lib /usr/local/lib
這些目錄是在系統(tǒng)啟動時就被設(shè)置好的,當(dāng)程序需要鏈接動態(tài)庫時,系統(tǒng)會自動在這些目錄中搜索相應(yīng)的庫文件。文章來源:http://www.zghlxwxcb.cn/news/detail-524677.html
-
方法四 就是本文所采用的方案,將 /usr/local/openssl/lib 添加到 LD_LIBRARY_PATH 環(huán)境變量中了,優(yōu)雅且簡單。(推薦)文章來源地址http://www.zghlxwxcb.cn/news/detail-524677.html
到了這里,關(guān)于python3.8 安裝 ssl 模塊 和 _ctypes 模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!