python3.8 安装 ssl 模块 和 _ctypes 模块
文章目錄
- 前情提要
- 安裝 openssl-1.1.1
- 重新編譯安裝 python3.8
- -rpath 編譯選項介紹
- python3.8 跟 python3.10 的區別
前情提要
我在之前給 python3.10 安裝 ssl 模塊后以為該步驟 “對于 python3.6、python3.8 應該同樣適用。” 。今天晚上我嘗試給服務器安裝一個帶 ssl 模塊的 python3.8 的時候,照著之前安裝 3.10 的方案來,然后失敗了-_-||。又折騰了一下,發現 3.8 和 3.10 的配置腳本是有區別的,不能一概而論,本文總結了一下 3.8 如何正確的編譯安裝 python 的 openssl 模塊及其原理,以及 3.8 和 3.10 配置腳本的區別。
安裝 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 設置安裝目錄 可以自定義 但是要記住,后面會用到
- make -j && make install 編譯并安裝
- 將 /usr/local/openssl/lib 路徑添加到系統動態庫查找路徑中,在 home 目錄下的 .bashrc 文件最后面添加下面這一行export LD_LIBRARY_PATH=/usr/local/openssl/lib:$LD_LIBRARY_PATH
- souce .bashrc 立即生效
重新編譯安裝 python3.8
- 切換到 python3.8 解壓包目錄
- 已經編譯過的可以先 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
到這應該安裝成功了,如果還有問題的話留言討論吧-_-||
-rpath 編譯選項介紹
-rpath 是 gcc 的一個編譯選項,用于指定程序運行時動態鏈接庫的搜索路徑。當程序運行時需要動態鏈接庫時,系統會在指定的路徑中搜索動態鏈接庫。
例如,假設有一個程序 a.out,它需要動態鏈接庫 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 選項指定程序運行時搜索動態鏈接庫的路徑。
這樣,當程序 a.out 運行時,系統會在 /usr/local/lib 目錄下搜索 libfoo.so 動態鏈接庫。
python3.8 跟 python3.10 的區別
查看 python3.8 配置腳本關于 openssl 的幫助信息
查看 python3.10.3 配置腳本關于 openssl 的幫助信息
python3.10.3 中多出來的這個選項是說是否在 gcc 編譯的時候傳遞 -rpath 選項給編譯器,所以可以按我這篇文章中的做法處理。
python3.8 的配置腳本沒有這個選項,但是他編譯過程中又查找的是名為 libssl.so 的動態庫。這時候我們不能傳遞 -rpath=/usr/local/openssl/lib, 只能采取其他辦法,想來這也是 3.10 新增選項的原因。
那要怎么解決這個問題呢,我想到有四種解決方案:
方法一 屬于奇技淫巧,將動態庫文件名實際指向靜態庫文件,即 ln -s libxxx.a libxxx.so,這樣即使沒有 -rpath 選項,也沒關系了,因為跟 python 編譯鏈接的是靜態庫,而靜態庫的路徑已經由 --with-openssl=/usr/local/openssl 選項指定了。(不推薦)
方法二 可以修改 python 的編譯腳本,強行指定 -rpath,這種做法和官方 3.10 做的效果一樣。(不推薦)
方法三 在系統的動態庫默認搜索路徑下創建一個指向 /usr/local/openssl/lib/ 下兩個需要的動態庫的軟鏈接。(不推薦)
Linux系統默認的C動態庫搜索目錄包括以下幾個:
這些目錄是在系統啟動時就被設置好的,當程序需要鏈接動態庫時,系統會自動在這些目錄中搜索相應的庫文件。
方法四 就是本文所采用的方案,將 /usr/local/openssl/lib 添加到 LD_LIBRARY_PATH 環境變量中了,優雅且簡單。(推薦)
總結
以上是生活随笔為你收集整理的python3.8 安装 ssl 模块 和 _ctypes 模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现NFA到DFA的转化(C语言)
- 下一篇: python物理引擎模拟三体_三体世界的