2023年1月1日 星期日

pyenv virtualenv 小記

markdown 工作機上面的 Ubuntu 預設裝 python 3.8,不過有個需求要跑在 python 3.9 上,就研究了一下將 python 升級的方法,然後才發現 python 要直接升級其實蠻麻煩的,用 pyenv 這隻工具還比較方便。 pyenv 可以讓使用者輕易的在電腦上裝不同的 python 版本,然後幫你管理,類似 node js 的 nvm 的功能吧。 過程中發現 virtualenv 這個套件,就順便研究一下,virtualenv 是用來隔離不同的 python package 的環境,例如建立了一個 virtualenv 環境後,在裡面用 pip 安裝各種第三方套件,都只會安裝在那個 virtualenv 環境中,只要離開該環境,就會像那些第三方套件沒裝過一樣。 pyenv 有一個 plugin [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv),裝完 pyenv 後預設就會有,可以直接用這個 plugin 來建立與管理 virtualenv 環境,不需要再額外裝 virtualenv。 可以用類似這樣的 command `pyenv virtualenv myenv` 來建立一個 virtualenv 環境,然後可以用 `pyenv activate myenv` 來啟用這個虛擬環境。建立的這個虛擬環境的 python 版本是取決於現在 `pyenv version` 顯示的版本,也就是可以在 pyenv 安裝的不同 python 版本中建立 virtualenv 虛擬環境。 pyenv 還有一個蠻方便的功能是,可以直接在 .python\_version 檔案中寫入你想使用的 virtualenv 環境名稱,例如用 `pyenv local myenv` 寫入 myenv 到當前目錄下的 .python\_version,然後當你進入這個目錄時,不用 activate virtualenv,你已經自動進入了 myenv 這個虛擬環境,可以在裡面隨意安裝套件了。為什麼會這樣的原因,跟 pyenv-virtualenv 底層實現有關係,就不細講了。 用上面的方法,雖然進入了虛擬環境,但是 shell prompt 不會提示你現在在 myenv 虛擬環境中,可以用 `pyenv activate` 來啟用 shell prompt 提示,在[官網](https://github.com/pyenv/pyenv-virtualenv#activate-virtualenv)有教學在 .bashrc 中加一行指令可以讓你在進入目錄後自動 activate virtualenv,這樣可以看到 shell 提示,而且有些套件例如 jedi 需要你 activate virtualenv 後才能正常運作,所以 activate virtualenv 除了在 shell 增加提示外應該還做了一些其他事情。 不過官方的自動 activate 實現有點問題,啟用後會讓 shell 動作變慢,就是按下 enter 後要等一下才會有反應,所以我沒有啟用自動 activate,反正我只要進入目錄後就已經在虛擬環境中了,沒有 activate 只是沒有 shell 提示而已,如果真的有套件一定要 activate 才能用,再手動 activate 就好。