Ubuntu下創(chuàng)建指定版本的Python3虛擬環(huán)境

在使用Python開(kāi)發(fā)項(xiàng)目的過(guò)程中,因每個(gè)項(xiàng)目依賴包數(shù)量不一,各版本依賴情況不同,為保證項(xiàng)目間互不干擾且運(yùn)行良好,通行的做法是為每個(gè)項(xiàng)目創(chuàng)建獨(dú)立的Python執(zhí)行環(huán)境,一般稱之為Python虛擬環(huán)境。使用Python2的時(shí)候,喜歡使用virtualenv工具創(chuàng)建虛擬環(huán)境。近期,Python3風(fēng)頭正勁,項(xiàng)目升級(jí)為Python3優(yōu)勢(shì)明顯,因此,考慮將開(kāi)發(fā)項(xiàng)目逐步基于Python3重寫(xiě)。開(kāi)始之初,首先要解決的就是Python3虛擬環(huán)境的創(chuàng)建。

圖片來(lái)源于網(wǎng)絡(luò),圖文無(wú)關(guān)

以下方法經(jīng)實(shí)際驗(yàn)證,可以適用于開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境下指定版本的Python3虛擬環(huán)境創(chuàng)建。以Ubuntu16.04生產(chǎn)系統(tǒng)下創(chuàng)建最新Python3.7.0版本虛擬環(huán)境為例,具體方法如下:

  • 環(huán)境準(zhǔn)備
    在Ubuntu16.04下系統(tǒng)默認(rèn)安裝了Python2.7.6和Python3.4.3,而當(dāng)前的項(xiàng)目要求的Python版本為3.7.0,為不影響和不改變系統(tǒng)Python運(yùn)行環(huán)境,需要下載Python3.7.0最新版本按需編譯,并基于該版本創(chuàng)建3.7.0的虛擬環(huán)境。

    mkdir /opt/soft
    wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz 
    tar zxvf Python-3.7.0.tgz
    cd Python-3.7.0
    
  • 編譯并安裝Python3
    編譯前指定Python3安裝路徑(重要)。指定python的安裝路徑,避免和系統(tǒng)已有的版本沖突,創(chuàng)建虛擬環(huán)境后Python3可以刪除。

    ./configure --prefix=/opt/python370
    make
    make install
    
  • 創(chuàng)建虛擬環(huán)境
    在Python3中已經(jīng)集成了虛擬環(huán)境創(chuàng)建命令,不需要再使用如virtualenv第三方工具,這也是Python3使用又一大好處,且可以使用絕對(duì)路徑完成創(chuàng)建,假設(shè)創(chuàng)建的虛擬環(huán)境名稱為t4-env。

    /opt/python370/python3.7 -m venv /opt/t4-env
    

    很簡(jiǎn)單,到這里虛擬環(huán)境就創(chuàng)建了,創(chuàng)建的同時(shí)就自帶安裝了pip和setuptools包管理工具。但好事多磨,還有一個(gè)問(wèn)題需要等著你去解決。使用pip list查看python3安裝的依賴包時(shí)出現(xiàn)了一下錯(cuò)誤信息:

    pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.

    很明顯,ssl模塊有問(wèn)題,Python3無(wú)法正確使用ssl模塊。定位到問(wèn)題是系統(tǒng)中安裝的openssl版本是1.0.1,而Python3.7.0需要的openssl版本是1.0.2或1.1.0以上。所以,先要解決openssl的問(wèn)題,繼續(xù)看以下解決方法:

  • openssl下載安裝
    同樣,在不明確升級(jí)openssl造成的影響,在不改變系統(tǒng)openssl版本的情況下,下載安裝openssl。

    首先,確認(rèn)安裝了以下組件:

    apt-get install ssl
    apt-get install libssl-dev
    

    其次,下載openssl并安裝

    cd /opt/soft
    wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz
    tar -zxvf openssl-1.1.0h.tar.gz
    cd openssl-1.1.0
    ./config --prefix=/usr/local/openssl --shared
    make
    make install
    /usr/local/openssl/bin/openssl version
    

    執(zhí)行最后一條命令時(shí)提示找不到庫(kù)文件,錯(cuò)誤信息如下:

    openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
    

    看來(lái)要做個(gè)軟連接,,,

    ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib/libssl.so.1.1
    ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib/libcrypto.so.1.1
    

    再執(zhí)行openssl版本查看命令,發(fā)現(xiàn)問(wèn)題已經(jīng)解決。成功在系統(tǒng)中安裝了另一個(gè)1.1.0版本openssl。好,別忘了再回頭解決Python3的問(wèn)題。

  • 重新編譯Python3并附加openssl

    cd /opt/soft/Python3.7.0
    ./configure --with-openssl=/usr/local/openssl --prefix=/opt/python370
    make clean &  make & make install
    /opt/python37/bin/python3.7 -m venv /opt/t4-env
    

至此,已經(jīng)成功創(chuàng)建了Python3.7.0版本的虛擬環(huán)境(t4-env)?;仡櫹陆鉀Q問(wèn)題的思路,下載和編譯執(zhí)行版本的Python3,并采用python3官方提供的新的創(chuàng)建env方式,通過(guò)執(zhí)行主程序?qū)⑻摂M環(huán)境創(chuàng)建到指定目錄,在創(chuàng)建虛擬環(huán)境后,發(fā)現(xiàn)pip總提示SSL錯(cuò)誤,經(jīng)檢查是openssl版本低于1.0.2的原因,下載openssl并編譯到指定目錄,再重新指定with-openssl參數(shù)編譯python3,最后,使用python3創(chuàng)建需要的虛擬環(huán)境。通過(guò)以上方式實(shí)現(xiàn)了可以獲取任意指定版本的虛擬環(huán)境,且不影響原ubuntu系統(tǒng)python版本,在實(shí)踐使用中效果明顯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容