在 Python 開發中,常常遇到每個專案都有不同的相依套件,甚至連 Python 的版本也可能不一樣。 而在單一主機中安裝和管理多個 Python 版本是一件很麻煩的事情。 所幸有許多工具可以輔助我們完成這項工作,例如 anaconda、docker 或雲端服務。 但本文要介紹的是使用 pyenv 搭配 virtualenv 來建立 Python 執行環境,這也是我最常使用的方法。

pyenv

pyenv 簡化了 Python 多版本共存的問題,使您能夠在單一主機中,安裝和切換不同版本的 Python。

在 macOS 中,只需使用 Homebrew 安裝即可。

            
                // 安裝 pyenv
                brew install pyenv

                // 修改環境變數
                echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
                echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
                echo 'eval "$(pyenv init -)"' >> ~/.zshrc
            
        

以下是 pyenv 一些常用的指令。

            
                # 查看可安裝的 Python 版本
                pyenv install --list

                # 查看所有已安裝的版本
                pyenv versions

                # 安裝特定版
                pyenv install 3.10.12

                # 切換 Python 版本
                pyenv global 3.10.12    對應於全域
                pyenv local 3.10.12     對應於當前資料夾
                pyenv shell 3.10.12     對應於當前 shell
            
        

virtualenv

virtualenv 讓您能夠為每個不同的專案建立特定的虛擬執行環境,確保每個專案的執行環境是獨立的。這有助於避免不同專案之間的依賴套件衝突,同時保持環境的隔離性。

            
                # 安裝 virtualenv
                pip3 install virtualenv

                # 切換到專案目錄,並執行以下指令生成虛擬環境
                # venv 是可以自訂的目錄名稱
                virtualenv venv

                # 也可以指定版 Python 版本生成虛擬環境
                virtualenv -p ~/.pyenv/versions/3.10.12/bin/python venv

                # 啟動環境
                # 啟動後,使用 pip 安裝的套件,都會裝在 venv 目錄中
                source venv/bin/activate

                # 關閉環境
                deactivate
            
        

實務做法

現在我在開發 python 專案時,一定會先使用 virtualenv 建立虛擬環境,然後再進行開發工作。

            
                # 建立專案目錄
                mkdir project

                # 切換到專案目錄
                cd project

                # 建立虛擬環境
                virtualenv venv

                # 啟動環境
                source venv/bin/activate

                # 進行開發
            
        

開發完成後,如果要將專案打包,您會發現 venv 資料夾相當大,因為它包含了整個專案的 Python 執行環境。 此時,您可以使用 pip freeze 指令導出依賴套件清單,之後就可以不用打包 venv 資料夾了。

            
                # 導出依賴套件清單
                pip3 freeze > requirements.txt
                
                # 未來可以使用以下指令將必要套件安裝回來
                pip3 install -r requirements.txt
            
        

關於部署的部分,比較建議將程式 docker 化,因為伺服器可能同時執行很多服務,如果每個服務都使用不同版本的 Python 程式,這樣伺服器一樣要裝很多不同版本的 Python 程式。 如果將程式 docker 化,就只需要在伺服器裝一套 docker 即可,這樣部署起來比較容易,環境也比較乾淨。