再論 Python Virtual Environment – 以 pyenv 為例

在 Ubuntu上安裝 pyenv

安裝必要的相關 packages

sudo apt-get update

sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python3-openssl git

接下來執行:

curl https://pyenv.run | bash

設定環境變數

安裝完成後,我們需要設置一些環境變數,以確保 shell 能夠找到並使用 pyenv。將以下幾行添加到 shell 配置文件中(例如 ~/.bashrc 或 ~/.zshrc,取決於使用的 shell)

要確認目前所使用的 shell可以使用以下這行指令

echo $SHELL

以我的 Ubuntu 來說我目前是使用:

/bin/bash

那我就要使用以下指令:

vim ~/.bashrc

.bashrc 檔案最下方加上以下的設定

# pyenv add by Sean Liu

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

source ~/.bashrc 是一個在 Unix 和類 Unix 系統(如 Linux 和 macOS)中常用的 shell 命令。這個命令的作用是重新載入 .bashrc 文件的內容,使其中的設定立即生效。

.bashrc 文件是一個位於使用者家目錄下的隱藏文件(以點開頭的文件在 Unix 系統中是隱藏的)。它包含了 Bash shell 的配置和設定,每次你打開一個新的 Bash shell 時,這個文件都會被自動執行。

.bashrc 文件通常包含環境變數設定、別名(alias)定義、自定義函數,以及其他 shell 行為的配置。這些設定讓你可以自定義你的 shell 環境,使其更符合你的工作習慣和需求。

當你修改了 .bashrc 文件後,這些更改並不會立即生效。這是因為當前運行的 shell instance 已經讀取過 .bashrc 文件,不會自動重新讀取。這就是 source 命令派上用場的地方。

source 命令(在某些 shell 中也可以用點號 . 來代替)會讀取並執行文件中的命令,就好像這些命令是直接在當前 shell 中輸入的一樣。當你運行 source ~/.bashrc 時,你實際上是告訴當前的 shell 重新讀取和執行 .bashrc 文件中的所有命令。

這個過程會使你剛才對 .bashrc 文件所做的任何修改立即生效,而不需要關閉並重新打開終端窗口。這對於測試新的 shell 配置或快速應用更改非常有用。

source ~/.bashrc  
# 或 source ~/.zshrc,取決於您使用的 shell

最後使用以下指令確認是否成功安裝

pyenv --version

盤點目前 OS上的 Python環境

使用 which 指令:這是最基本的方法,可以找出系統預設的 Python 路徑:

which python
which python3

/Users/liushihyen/opt/anaconda3/bin/python

使用 ls 指令查看 /usr/local/bin 目錄:許多 Python 版本會安裝在這個目錄下:

ls -l /usr/local/bin/python*

lrwxr-xr-x  1 liushihyen  admin  38  6  2 23:46 /usr/local/bin/python-build -> ../Cellar/pyenv/2.4.1/bin/python-build
lrwxr-xr-x  1 liushihyen  admin  40  4 25 15:54 /usr/local/bin/python3 -> ../Cellar/python@3.12/3.12.3/bin/python3
lrwxr-xr-x  1 liushihyen  admin  47  4 25 15:54 /usr/local/bin/python3-config -> ../Cellar/python@3.12/3.12.3/bin/python3-config
lrwxr-xr-x  1 liushihyen  admin  44  6  2 23:10 /usr/local/bin/python3.10 -> ../Cellar/python@3.10/3.10.14/bin/python3.10
lrwxr-xr-x  1 liushihyen  admin  51  6  2 23:10 /usr/local/bin/python3.10-config -> ../Cellar/python@3.10/3.10.14/bin/python3.10-config
lrwxr-xr-x  1 liushihyen  admin  43  6  2 23:14 /usr/local/bin/python3.11 -> ../Cellar/python@3.11/3.11.9/bin/python3.11
lrwxr-xr-x  1 liushihyen  admin  50  6  2 23:14 /usr/local/bin/python3.11-config -> ../Cellar/python@3.11/3.11.9/bin/python3.11-config
lrwxr-xr-x  1 liushihyen  admin  43  4 25 15:54 /usr/local/bin/python3.12 -> ../Cellar/python@3.12/3.12.3/bin/python3.12
lrwxr-xr-x  1 liushihyen  admin  50  4 25 15:54 /usr/local/bin/python3.12-config -> ../Cellar/python@3.12/3.12.3/bin/python3.12-config
lrwxr-xr-x  1 liushihyen  admin  41  4 25 16:11 /usr/local/bin/python3.8 -> ../Cellar/python@3.8/3.8.19/bin/python3.8
lrwxr-xr-x  1 liushihyen  admin  48  4 25 16:11 /usr/local/bin/python3.8-config -> ../Cellar/python@3.8/3.8.19/bin/python3.8-config
lrwxr-xr-x  1 liushihyen  admin  43  2  1  2024 /usr/local/bin/python3.9 -> ../Cellar/python@3.9/3.9.18_2/bin/python3.9
lrwxr-xr-x  1 liushihyen  admin  50  2  1  2024 /usr/local/bin/python3.9-config -> ../Cellar/python@3.9/3.9.18_2/bin/python3.9-config

如果是在 Mac上可以使用 Homebrew 指令查看通過 Homebrew 安裝的 Python 版本:

brew list | grep python

python-packaging
python@3.10
python@3.11
python@3.12
python@3.8
python@3.9

使用 pyenv管理 Ubuntu系統上的 Python

列出所有可安裝的 Python

pyenv install --list
pyenv install --list | grep " 3\."

CLI 會列出所有可以透過 pyenv 進行安裝的 Python versions

Available versions:
  2.1.3
  2.2.3
  2.3.7...

使用 pyenv安裝 Python

使用 pyenv 安裝特定版本的 Python(ex. Python v3.10.x)

pyenv install 3.10

檢視安裝結果

檢視透過 pyenv 安裝的 Python 版本

pyenv versions

以我的 Ubuntu上的環境會在 CLI上輸出以下內容。

* system (set by /home/ubuntu/.pyenv/version)
  3.9.7
  3.9.7/envs/myenv
  3.10.12
  3.10.14
  3.11.9
  myenv --> /home/ubuntu/.pyenv/versions/3.9.7/envs/myenv

執行各個 Python 版本查看具體版本號,找到 Python 執行檔後,可以執行它們來查看具體版本:

python --version

python3 --version

/usr/local/bin/python3.9 --version

在 Mac上安裝 pyenv 管理虛擬環境

確認有無安裝 pyenv

要檢查 pyenv 是否已經安裝在 Mac 上,有幾種簡單的方法,第一個是使用 which 指令,這是最直接的方法,在 CLI中輸入

pyenv versions

安裝 pyenv

brew install pyenv
brew install pyenv-virtualenv

首先,brew install pyenv 這個命令使用 Homebrew package 管理器來安裝 pyenv。Homebrew 是 macOS 上非常流行的第三方 Package Manager,它簡化了在 Mac 上安裝、更新和管理各種軟體的過程。

pyenv 的工作原理是通過修改系統的 PATH 環境變量來控制哪個 Python 版本被使用。它還可以為每個項目配置特定的 Python 版本,這大大增加了開發環境的靈活性。安裝 pyenv 後,開發者可以輕鬆地安裝、管理和切換不同版本的 Python。

第二個命令 brew install pyenv-virtualenv 是用來安裝 pyenv-virtualenv package的。pyenv-virtualenv 是 pyenv 的一個擴展,它將 pyenv 和 Python 的 virtualenv 功能結合在一起。virtualenv 是一個建立隔離的 Python 環境的工具,每個環境都有自己的安裝目錄和 packages,不會與其他虛擬環境或全域安裝的 packages 相互干擾。

pyenv-virtualenv 插件讓您可以使用 pyenv 命令來創建和管理虛擬環境,而不需要單獨使用 virtualenv 命令。這簡化了工作流程,使得在不同的 Python 版本和項目環境之間切換變得更加容易。

which pyenv

which 是一個 Unix 命令,用於定位可執行文件的路徑。當您在 CLI 中輸入一個命令時,系統會在 PATH 環境變數指定的目錄中搜尋該命令的可執行文件。which 命令會顯示它找到的第一個匹配項目的完整路徑。

在這個特定的例子中,which pyenv 是在查詢 pyenv 命令的位置。

當您執行 which pyenv 時,系統會搜索 PATH 中的所有目錄,尋找名為 “pyenv” 的可執行文件。如果找到了,它會顯示該文件的完整路徑,以我的 Ubuntu環境來說,CLI 會輸出如下的內容:

/usr/local/bin/pyenv

嘗試執行 pyenv 指令,直接在 CLI中輸入,檢視目前安裝的 pyenv版本

pyenv --version

安裝虛擬環境

pyenv virtualenv 3.10 deus_langchain_lab_pyenv

列出目前系統中有哪些 pyenv的虛擬環境

pyenv versions

會看到系統中新增了一個名為 deus_langchain_lab_pyenv 的虛擬環境

* system (set by PYENV_VERSION environment variable)
  3.9.7
  3.9.7/envs/myenv
  3.10.12
  3.10.14
  3.10.14/envs/deus_langchain_lab_pyenv
  3.11.9
  deus_langchain_lab_pyenv --> /home/ubuntu/.pyenv/versions/3.10.14/envs/deus_langchain_lab_pyenv
  myenv --> /home/ubuntu/.pyenv/versions/3.9.7/envs/myenv=

啟動虛擬環境

pyenv local myproject-env

使用 Homebrew 安裝的 pyenv,可以用以下指令檢查

brew list | grep pyenv

使用 pyenv

使用 pyenv 建立新的虛擬環境

pyenv virtualenv {{Python Version}} {{Virtual Environment Name}}

pyenv virtualenv 3.9.7 myproject-env

pyenv 是一個的 Python 版本管理工具。它允許我們在同一台機器上安裝和使用多個 Python 版本。

virtualenvpyenv 命令的一個子命令。它告訴 pyenv,我們想要創建一個新的虛擬環境。虛擬環境是一個獨立的 Python 環境,它有自己的 Python 解釋器和套件集。這樣可以確保不同專案之間的依賴不會相互干擾。

3.9.7 是我們要用來創建這個虛擬環境的 Python 版本。這意味著新創建的虛擬環境將使用 Python 3.9.7 版本。使用特定版本的 Python 可以確保我們的專案在不同環境中的一致性。

最後,myproject-env 是我們給這個新虛擬環境起的名字。這個名字可以是任何我們想要的,通常會選擇一個能反映專案特性的名稱。在未來,我們可以通過這個名字來啟動或管理這個虛擬環境。

執行這個命令後,pyenv 會創建一個新的虛擬環境。這個環境會包含一個乾淨的 Python 3.9.7 安裝,以及一些基本的工具如 pip。這個新環境是獨立的,不會影響到系統的 Python 安裝或其他虛擬環境。

創建虛擬環境後,我們可以使用 pyenv activate myproject-env 來啟動它。啟動後,我們就可以在這個環境中安裝專案所需的特定套件,而不會影響到其他專案或系統級的 Python 安裝。

如何切換於虛擬環境間

切換進入使用 pyenv 建立起名為 {{Virtual Environment Name}} 的虛擬環境

pyenv activate {{Virtual Environment Name}}

例如我要切換到我一個名為 deus_langchain_lab_pyenv 的虛擬環境

pyenv activate deus_langchain_lab_pyenv

成功完成虛擬環境啟動我的 CLI將呈現如下:

(deus_langchain_lab_pyenv) ubuntu@ip-xxx-xxx-xxx-xxx:~/wwwdata/sites/python_lab$

離開當前的 pyenv 虛擬環境

pyenv deactivate

檢視當前使用的 Python Interpreter

pyenv which python

這會顯示類似下方的輸出在 CLI中:

/home/ubuntu/.pyenv/versions/deus_langchain_lab_pyenv/bin/python

為何在不同的 Virtual Environment下用 which python 看到的都是如下的輸出呢?

/home/ubuntu/.pyenv/shims/python

pyenv 使用一種稱為 “shims” 的技術來管理不同的 Python 版本和虛擬環境。當你安裝 pyenv 時,它會在你的 PATH 中插入一個 “shims” 目錄。這個目錄包含了許多輕量級的可執行文件,這些文件會攔截對 Python 及其相關工具的調用。

當你執行 python 命令時,實際上首先執行的是 shim。這個 shim 會檢查當前環境的設置(如通過 pyenv localpyenv global 設置的版本),然後調用適當的 Python 解釋器。這就是為什麼 which python 總是指向 shim 路徑,而不是實際的 Python 解釋器路徑。

雖然 which python 顯示的是 shim 的路徑,但實際使用的 Python 解釋器是正確的,對應於你當前所啟用的虛擬環境。如果你想看到實際使用的 Python 解釋器路徑,可以使用 pyenv which python 命令。這個命令會顯示當前環境中實際使用的 Python 解釋器的完整路徑。

這種設計使得 pyenv 能夠絲滑的在不同的 Python 版本和虛擬環境之間切換,而無需修改系統的 PATH 或其他環境變數。它提供了一種靈活的方式來管理多個 Python 版本和環境,特別適用於需要在不同項目中使用不同 Python 版本的開發者。


如何不切換環境去執行某一個特定虛擬環境內的 Python scripts?

~/.pyenv/versions/環境名稱/bin/python your_script.py

如何離開虛擬環境?

pyenv shell system

pyenv shell {{Virtual Environment Name}} 與 pyenv local {{Virtual Environment Name}} 兩者間的差別

pyenv shell {{Virtual Environment Name}}

  • 臨時性:只在當前的 shell 會話中生效。
  • 範圍:只影響當前的終端視窗或 shell 會話。
  • 持久性:關閉終端或開啟新的 shell 會話後就失效。
  • 優先級:優先級最高,會覆蓋 global 和 local 設置。
  • 使用場景:臨時測試或在特定會話中使用不同的 Python 版本。
  • 取消方法:使用 pyenv shell –unset 或關閉當前 shell。

pyenv local {{Virtual Environment Name}}

  • 持久性:在特定目錄中持久生效。
  • 範圍:只影響當前目錄及其子目錄。
  • 機制:在當前目錄創建一個 .python-version 文件。
  • 優先級:高於 global 設置,但低於 shell 設置。
  • 使用場景:為特定專案設置 Python 版本或虛擬環境。
  • 取消方法:刪除 .python-version 文件或使用 pyenv local --unset

使用建議

  • 對於特定專案,使用 pyenv local 設置專案的 Python 環境。
  • 如果需要臨時切換環境進行測試或其他操作,使用 pyenv shell
  • 在使用 pyenv local 後,進入該目錄時會自動切換到指定的環境。

檢視目前環境中有哪些 Virtual Environments

find ~/ -type d -name "venv" -o -name ".venv"

/home/ubuntu/anaconda3/lib/python3.9/venv
/home/ubuntu/anaconda3/lib/python3.9/site-packages/jedi/third_party/typeshed/stdlib/3/venv
/home/ubuntu/anaconda3/pkgs/python-3.9.12-h12debd9_0/lib/python3.9/venv
/home/ubuntu/anaconda3/pkgs/jedi-0.18.1-py39h06a4308_1/lib/python3.9/site-packages/jedi/third_party/typeshed/stdlib/3/venv
/home/ubuntu/.pyenv/versions/3.9.7/lib/python3.9/venv
/home/ubuntu/.pyenv/versions/3.10.14/lib/python3.10/venv
/home/ubuntu/.pyenv/versions/3.11.9/lib/python3.11/venv
/home/ubuntu/.pyenv/versions/3.10.12/lib/python3.10/venv

pyenv versions

* system (set by /home/ubuntu/.pyenv/version)
  3.9.7
  3.9.7/envs/myenv
  3.10.12
  3.10.14
  3.11.9
  myenv --> /home/ubuntu/.pyenv/versions/3.9.7/envs/myenv

安裝 LLM實驗環境

安裝 OpenAI

pip install openai

安裝 LangChain

pip install langchain

安裝進行數據分析或科學計算相關 packages

pip install numpy pandas matplotlib scipy

安裝 MySQL

sudo apt-get update

sudo apt-get install python3-dev default-libmysqlclient-dev build-essential pkg-config

pkg-config --version

pip install mysql-connector-python mysqlclient

安裝 python-dotenv

python-dotenv 是一個非常實用的 Python 套件,它的主要功能是幫助開發者管理專案中的環境變數。這個套件的核心概念 revolves 圍繞著讀取和設置 .env 檔案中的 key-value pair。

在軟體開發過程中,我們經常需要處理各種設定資訊,例如資料庫連接字串、API Key、伺服器IP等。這些資訊通常會因不同的執行環境(如開發、測試、生產)而有所不同。python-dotenv 就是用來彈性的管理這些配置。

使用 python-dotenv,你可以將這些配置資訊存儲在一個名為 .env 的檔案中。這個檔案通常包含一系列的 key-value pair,每一行代表一個環境變數。例如:DATABASE_URL=postgresql://user:pass@localhost/dbpython-dotenv 會讀取這個檔案,並將這些鍵值對設置為環境變數。

這個 package 能讓你將敏感資訊(如密碼、API金鑰)從程式碼中分離出來。

實務上我們要將 .env 檔案加入到 .gitignore 中,這樣就可以避免將敏感資訊上傳到版本控制系統,以提高專案的安全性。

另外 python-dotenv 還支援多環境配置。開發者可以為不同的環境(如開發、測試、生產)維護不同的 .env 檔案,使得在不同環境間切換變得非常容易。這大大提高了專案的可移植性和靈活性。

在實際使用中,python-dotenv 提供了多種方法來載入環境變數。開發者可以在程式啟動時自動載入,也可以在需要時手動載入。它還提供了覆蓋現有環境變數的選項,讓你能夠更精細地控制配置。

pip install python-dotenv

檢視所有已安裝的套件

pip list 命令會在 CLI 中顯示所有已安裝套件的列表,包括套件名稱和版本號。

pip list

pip list --verbose 會額外顯示每個套件的位置和安裝者等資訊。

pip list --verbose

安裝 Jupyter Notebook

安裝指令

pip install notebook
pip install jupyterlab

確認安裝

jupyter --version

Selected Jupyter core packages...
IPython          : 8.27.0
ipykernel        : 6.29.5
ipywidgets       : not installed
jupyter_client   : 8.6.2
jupyter_core     : 5.7.2
jupyter_server   : 2.14.2
jupyterlab       : 4.2.5
nbclient         : 0.10.0
nbconvert        : 7.16.4
nbformat         : 5.10.4
notebook         : 7.2.2
qtconsole        : not installed
traitlets        : 5.14.3

啟動 notebook

jupyter notebook

jupyter notebook > /dev/null 2>&1 &

nohup jupyter notebook > jupyter.log 2>&1 &

首先列出所有運行中的 notebook

jupyter notebook list

停止 notebook

jupyter notebook stop

其他 package 相關管理

列出已安裝的 packages

pip list

這會以 requirements.txt 的格式顯示套件,方便直接複製到文件中。

pip freeze

只顯示用戶安裝的 packages(不包括預設 packages)

pip list --user

以 JSON 格式輸出

pip list --format=json

Leave a Comment

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