在安裝Python 3.12以上版本的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 24.04、Debian 12、Arch Linux、Fedora 41、openSUSE、Raspberry Pi OS 12等系統,macOS的Homebrew用戶可能也會遇到。
老實說這個不是錯誤,是開發者故意設計的行為,詳細見2021年的PEP 668提案內容。這樣做是為了防止Python的套件跟Linux系統套件管理員衝突。有時候Python套件一加入環境變數,便可能讓APT混淆Linux系統與Python的套件。或者,依賴Python程式的套件可能因為Python版本更新而壞掉。
但是這樣就不能pip install了呀!該怎辦?
這有很多種解決方法。就Linux系統維護的角度來看,我不建議強行破除此限制。建議學習改用較為安全的Python套件安裝方式。
下面會提供暫時的解決方法,並提供替代的Python套件安裝法,這又可以分為「Python虛擬環境」和「pipx安裝法」。
1. 暫時的解決方法#
恢復到以前模式,允許pip在系統安裝套件。這個方法可能會讓Python破壞Linux系統依賴,請小心。
- 確認系統Python版本,撰文當下是3.12
python3 --version
- 將
/usr/lib/python版本/EXTERNALLY-MANAGED
檔案重新命名,這樣就不會觸發error: externally-managed-environment
警告了。
sudo mv /usr/lib/python3.12/EXTERNALLY-MANAGED /usr/lib/python3.12/EXTERNALLY-MANAGED.old
- 另一個作法是加上
--break-system-packages
引數,強制安裝:
sudo pip install <套件名稱> --break-system-packages
2. 改用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版本。
3. 改用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建立的虛擬環境額外安裝套件,請使用
pipx inject <虛擬環境名稱> <Python套件名稱>
的指令安裝。 - pipx沒有切換Python版本的功能。