在安裝Python 3.11以上版本的Linux系統,如果執行pip install
指令,可能會遇到以下錯誤:
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.
error: externally-managed-environment
這個錯誤見於新版的Ubuntu、Arch Linux、Fedora、openSUSE、Raspberry Pi OS等系統,macOS的Homebrew用戶可能也會遇到。
老實說這個不是錯誤,是開發者故意設計的行為,詳細提案內容見2021年的 PEP 668。這樣做是為了防止Python的套件跟Linux系統套件管理員衝突。有時候Python套件一加入環境變數,便可能讓APT混淆Linux系統與Python的套件。或者,依賴Python程式的套件可能因為Python版本更新而壞掉。
但是這樣就不能pip install了呀!該怎辦?
這有很多種解決方法。就Linux系統維護的角度來看,我不建議強行破除此限制。建議學習改用較為安全的Python套件安裝方式。
這又可以分為「Python虛擬環境」和「pipx安裝法」。
1. 改用Python虛擬環境安裝pip套件#
第一種方式是使用Python虛擬環境 (virtual environment),也就是安裝Python套件前都先用venv建立一個虛擬環境,讓Python的套件跟Linux系統套件隔離,再於裡面安裝pip。此外,虛擬環境也可以防止不同專案的Python套件互相衝突。
- 從Linux套件庫安裝Python虛擬環境工具
sudo apt install python3-venv
- 在家目錄建立一個叫做venv的虛擬環境,實際上就是一個新目錄:
cd ~
python3 -m venv venv
- 然後用以下指令進入虛擬環境
source venv/bin/activate
- 就可以正常用pip install安裝套件了。所有pip install安裝的套件都會跑到
venv
這個虛擬環境的目錄下。
pip install yt-dlp
- 日後要執行虛擬環境裡面的程式,都必須先進入才可啟用
source venv/bin/activate
yt-dlp --version
註:Python虛擬環境依賴的是Linux系統所安裝的Python版本,若要更進階的虛擬環境操作請裝 Anaconda,允許你同時安裝多重Python版本。
2. 改用pipx安裝Python套件#
第二種方式適合習慣pip install的用戶。
你可能會覺得Python虛擬環境比pip install還麻煩了呀!每次都要跑一次進入虛擬環境的指令。
如果你想裝的Python程式是單一執行檔,希望Python pip套件安裝後可以直接從命令行執行?此時「pipx」就是一個好用的工具。它指令長得跟pip install很像,會給每個安裝的Python套件自動建立虛擬環境,並連結到對應的執行檔。這樣我們就能無縫使用新安裝的Python套件。
- 參照 Github指示,從Linux套件庫安裝pipx:
sudo apt install pipx
- 讓pipx將必要路徑加入環境變數
pipx ensurepath
- 這樣就可以用pipx安裝原本pip的套件了,例如yt-dlp
pipx install yt-dlp
- 安裝後可直接從命令行使用
yt-dlp --version
一些技術性細節:
- pipx安裝的套件預設會放到
~/.local/bin
,這裡存放的是各個Pyhton套件的符號連結檔,實際會指向~/.local/share/pipx/venvs/
目錄的虛擬環境。因為~/.local/bin
被加入環境變數,所以使用者才能從命令行執行pipx安裝的程式。 - pipx所安裝的套件只有目前使用者可用。若要讓全系統使用者可用,需要使用
pipx ensurepath --global
。 - pipx沒有切換Python版本的功能。