用 pyenv 與 pipenv 打造一個潔癖患者的 Python 開發環境

用 pyenv 與 pipenv 打造一個潔癖患者的 Python 開發環境

這一篇文章受到了 PyConTW 總召 TP 的 PyConTW 2018 Talk – 這樣的開發環境沒問題嗎? 的啟發,以及在 Taipei.py x PyConTW 的 Sprint 裡面看到 Pipenv 裡面好多好棒棒的功能(以及心中對開發環境的潔癖作祟),所以才寫了這篇文章記錄要怎麼做出一個 Python 開發環境潔癖重症患者喜愛的開發環境。

Warning: 需要對 Unix-like OS 有基礎認知,不然你可能就會找不到你的 Python 在哪裡。

其實很多作業系統都會自帶 Python,大部分的 Linux(e.g. Ubuntu)與 Mac OS 都有內建 Python 2.x,然而很多 System software 都會高度依賴 Python,所以如果把系統內建的 Python 刪掉,會很好玩哦

因此,我們並不打算把原生的 Python 刪掉,我們傾向秉持著互不侵犯原則,我不用系統內建的 Python,系統內建的 Python 也別想來擾亂我的開發環境的概念。

而這裡敘述只以 Mac 作為範例,Ubuntu 的話可以自己研究,或是我哪天太閒把這些事情在 Ubuntu 重現一次再更新到此篇。

我們會需要使用的工具有這兩個:

推薦 pyenvpipenv 都使用 Homebrew 安裝,如果你使用 zsh 並且是 oh-my-zsh 的愛用者,又已經透過 Homebrew 安裝了 pyenv 的話,千萬不要用 pyenv 的 plugin,否則你會有兩個 pyenv,雖然在操作 shell 時體感很好,還提供了版本號自動補全功能,但每次開啟一個新的 Terminal 都會需要等待 pyenv 載入,大概耗時會兩秒,超慢,別用。

可以先嘗試以下指令來試試 pyenvpipenv 是怎麼樣的東西:

pyenv 的常用指令如下,global 與 local 的差異是當前資料夾使用的 python 版本,但我通常只使用 global。

pipenv 的常用指令如下,基本上就跟 pip 完全一樣,如果有需要的情況可以使用 pipenv shell 達到像是 virtualenv. venv/bin/activate 效果。

但因為我不想要安裝任何 package 在系統原生的 Python 當中,甚至連使用都不想使用它的話,那就可以使用 pyenv + pipenv 達到組合技,使自己平常使用的 Python 可以成為獨立於系統內建 Python 之外的另一隻程式。只需要設定好環境變數,讓使用到的 Python 是自己建立的 Symbolic Link 就可以了。

因此我們要先針對 ~/.zshrc 做 configuration,設定 PATH 把自己家目錄下的 ~/.local/bin 放在優先權最高的位置:

而我從 Homebrew 安裝的 pyenv 預設路徑是 ~/.pyenv,可以在路徑當中找到所有安裝的 Python 版本,這裡面有一個 shims 資料夾,shims 的功能就是作為 Symbolic Link,若我們能將它設定成環境變數 PATH ,使用到的 pythonpip 就都會是 shims 資料夾裡面的 shell script 了。但這個並不符合我們的需求,我們希望可以基於 pyenvshims 之上,建立出 virtualenv,並且實際使用到的 pythonpip 是 virtualenv 裡面的 executable,如此一來即使我們自己編譯的 Python 環境被弄髒,也只需要把 virtualenv 砍掉重建就可以回到乾淨的 Python 了,不需要重新編譯安裝。

所以我又建立了一個 ~/.pipenv 作為存放所有 virtualenv 的資料夾,並寫了一個 script 幫 pyenv 新增了一個自己定義的 change function。pyenv change 會做的事情有:

  1. 檢查有沒有指定的 Python 版本
  2. 切換到該版本
  3. 若該版本的 virtual environment 還不存在,就用 pipenv 建立一個
  4. 把 virtualenv 的 python 與 pip link 到 ~/.local/bin

只需要將以下 script 存在 ~/.local/bin/pyenv ,並執行 chmod +x ~/.local/bin/pyenv 就可以了。

此時,你已經可以使用 pyenv change 2.7.15 建立出一個 2.7.15 且在 virtual environment 中的 Python 了,可以使用以下 code 來驗證:

可以發現,我們執行的 Python 是 /Users/aweimeow/.local/bin/python,且這個是一個 symbolic link,指向到 .pipenv 下的 2.7.15 虛擬環境了。

專案開發環境

我們現在已經可以使用 pyenv change 3.6.5 來方便的切換 python 版本了,那這樣還能夠在 project 目錄裡面建立一個又獨立的 environment 嗎?可以!

因為 pipenv 最多 support 兩層 virtualenv,所以我們還是可以在專案目錄下建立 virtual environment:

大概就是這樣子,Enjoy with pyenv & pipenv ( ´ ▽ ` )ノ

5 Replies to “用 pyenv 與 pipenv 打造一個潔癖患者的 Python 開發環境”

  1. 請問文章中說到的 ~/.local 跟 usr/local/bin 的 local 好像是相同的,但正確路徑是不是 /usr/local 才對?

  2. aweimeow 你好:
    我根據你的文章安裝完pyenv pipenv, 也準備好 ~/.local/bin/pyenv
    但當我執行pyenv change 3.6.5 時, 會有rm: /Users/[name]/.local/bin/python: No such file or directory
    我該注意什麼地方嗎?
    另外我的~/.local 資料夾是我自己建出來的,原本沒有,會有影響嗎?

Leave a Reply

Your email address will not be published. Required fields are marked *