Python 多版本共存問題 2

Python 多版本共存問題 2

? 本文主要討論 多種版本的 Python 模塊的共存與調(diào)用問題,并嘗試給出一種清爽的解決辦法。

多種版本的 Python Module?

? 伴隨 Python 逐步成為數(shù)據(jù)科學領(lǐng)域的主力研發(fā)語言,越來越多的機器學習庫都發(fā)布了 Python 版本,包括了著名的 scikit-learn,tensorflow,keras 等。正是由于數(shù)據(jù)科學近年來在基礎(chǔ)算法和計算架構(gòu)上的迅猛發(fā)展,這些Python module 也頻繁地發(fā)布新版本。

? 最令人惡心的 Tensorflow 還未發(fā)布穩(wěn)定版 1.0.0 之前時,幾乎每個次級版本的Tensorflow的 API都不一樣。當然這主要是由于深度學習領(lǐng)域的算法層出不窮,另一方面我個人猜測是由于Tensorflow代碼在不斷根據(jù)google的計算平臺變化做出演進

? 那么問題就來了,可能三個月前自己寫的 Seq2Seq 的 tf 代碼,在新版的 Tensorflow 中就已經(jīng)不能運行,這就是因為版本變化帶來的API變化導致。那么有人說,只要我一直不更新 TF 不就好了嗎?

? 理想豐滿,現(xiàn)實骨感!

  • 筆者使用的Ubuntu 機器是實驗室共有的,TF 是否更新,服務(wù)器管理員的決定權(quán)也是很重要的!

  • 最新版本的 TF 的計算效率相對來說總是在改進的:新版的 TF 可以使用更新的 CUDA 版本以及 CUDNN版本。

  • 新來的開發(fā)者通常愿意去采用最新穩(wěn)定版的 TF 來開發(fā)算法,如果要使用他們開發(fā)的算法,那么勢必需要在對應(yīng)的 TF 版本中才能運行。

    有鑒于此,為了同時運行新老代碼,我們通常選擇在同一臺機器上配置共存的多版本 Module。

如何配置并使用多種版本 module?

? 一個簡單的想法是,對每一個開發(fā)任務(wù),創(chuàng)建一個單獨的環(huán)境,這個環(huán)境有獨立于外界的模塊。只要我們進入了這個單獨的環(huán)境,就可以在里面安裝并使用任務(wù)對應(yīng)版本的模塊了。

? 幸運的是,這樣做的方法有很多,例如 docker。但這里我們暫時用不到這么高大上的技術(shù),我們只需要采用 virtualenv 命令即可。

  • 利用 virtualenv 命令創(chuàng)建獨立的 Python 環(huán)境

    • virtualenv 的安裝

      # 安裝 Python 2.7下的virtualenv
      sudo pip install virtualenv
      
    • 采用 virtualenv 命令創(chuàng)建一個獨立的 Python 環(huán)境

      # 創(chuàng)建一個空間放置我可能創(chuàng)建的多個環(huán)境
      mkdir ~/my_lib/py_env
      cd ~/my_lib/py_env
      
      # 假設(shè)系統(tǒng)默認的 Python 為 Python 2.7
      # 創(chuàng)建 Python 2.7 的獨立環(huán)境
      virtualenv py27_env
      
    • 如何進入該獨立的 Python 環(huán)境呢?

      ? 注意到,這里的進入 獨立的Python環(huán)境的意思并不是一定要 cd 到上一步創(chuàng)建的Python獨立環(huán)境所在文件夾處,幾乎可以在任意位置啟動環(huán)境。

      ? 啟動環(huán)境的意思是,在這個環(huán)境中,除了 Python 相關(guān)的命令,其余諸如 cd,ls等命令與外界無異,只有和 Python 相關(guān)的命令例如 pip, python 等才會有獨立于外界的命令。

      cd ~
      # 可以在任意位置進入該 Python 環(huán)境
      source ~/my_lib/py_env/py27_env/bin/activate
      # 事實上,上述命令可以理解為將 ~/my_lib/py_env/py27_env/bin 加入系統(tǒng)路徑,且優(yōu)先級最高。但 ~/my_lib/py_env/py27_env/bin 文件夾中只存在和 Python 相關(guān)的命令,因此只有 Python 相關(guān)命令的執(zhí)行會受該環(huán)境的影響
      
    • 如何退出該獨立的 Python 環(huán)境

      deactivate
      
  • 在對應(yīng)的獨立環(huán)境中安裝任意版本的模塊

    我們這里的任務(wù)是創(chuàng)建一個 Python 3.5 環(huán)境,然后利用 pip 安裝 tensorflow 的1.0.1 gpu版本

    • 先創(chuàng)建 Python 3.5 環(huán)境,激活它

      # 創(chuàng)建 Python 3.5 環(huán)境
      # -p PYTHON_EXE_PATH 參數(shù),也可以換成 --python=PYTHON_EXE_PATH
      # 代表創(chuàng)建的該獨立環(huán)境所依據(jù)的系統(tǒng) Python 命令來自哪兒,改變參數(shù)可以得到不同版本 Python 獨立環(huán)境
      virtualenv -p /usr/bin/python3.5 ~/my_lib/py_env/py35_env
      # 激活它
      source ~/my_lib/py_env/py35_env/bin/activate
      
    • 安裝 tensorflow 1.0.1 gpu 版本

      pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.0.1-cp34-cp34m-linux_x86_64.whl
      # 這里的執(zhí)行的命令 pip 換成 pip3 或者 pip3.5都可以,這三個命令都是~/my_lib/py_env/py35_env/bin/ 中的
      # 值得注意的是,這里可以運行 pip2,這里的 pip2就是系統(tǒng)命令了,即 /usr/bin/pip2了??梢圆捎?which pip2 驗證一下
      which pip2
      which pip
      which pip3
      which pip3.5
      
    • 可以進入 Python 解釋器看看

      # 以下三個命令都可以進入 該獨立環(huán)境對應(yīng)的 Python 3.5環(huán)境
      python
      python3
      python3.5
      

      進入解釋器之后

      import tensorflow as tf
      # 查看該 tensorflow 的安裝位置
      print(tf.__path__)
      
  • virtualenv 的更多選項

    這里的系統(tǒng) Python 環(huán)境是指創(chuàng)建該獨立環(huán)境時的 -p 參數(shù)

    • --no-site-packages 選項代表 安裝到系統(tǒng)Python環(huán)境中的所有第三方包都不會復制過來,目前我看到這個是默認執(zhí)行的
    • --system-site-packages 選項代表該虛擬環(huán)境可以訪問系統(tǒng) Python環(huán)境中的 第三方包
    • 更多的選項直接在 shell 端輸入 virtualenv 即可查看
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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