快轉到主要內容

解決Ubuntu系統pip install的"error: externally-managed-environment" 錯誤,改用虛擬環境安裝套件

· 民國113年甲辰年
·
切換繁體/簡體
分類   Linux系統 Linux使用技巧
標籤   Python
目錄

在安裝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系統依賴,請小心。

  1. 確認系統Python版本,撰文當下是3.12
python3 --version
  1. /usr/lib/python版本/EXTERNALLY-MANAGED檔案重新命名,這樣就不會觸發error: externally-managed-environment警告了。
sudo mv /usr/lib/python3.12/EXTERNALLY-MANAGED /usr/lib/python3.12/EXTERNALLY-MANAGED.old
  1. 另一個作法是加上--break-system-packages引數,強制安裝:
sudo pip install <套件名稱> --break-system-packages

2. 改用Python虛擬環境安裝pip套件
#

使用Python的虛擬環境 (virtual environment) 功能,也就是安裝Python套件前都先用venv建立一個虛擬環境,讓Python的套件跟Linux系統套件隔離,再於裡面安裝pip。

虛擬環境也可以防止不同專案的Python套件互相衝突。

  1. 從Linux套件庫安裝Python虛擬環境工具
sudo apt install python3-venv
  1. 在家目錄建立一個叫做venv的虛擬環境,實際上就是一個新目錄:
cd ~

python3 -m venv venv
  1. 然後用以下指令進入虛擬環境
source venv/bin/activate
  1. 就可以正常用pip install安裝套件了。所有pip install安裝的套件都會跑到venv這個虛擬環境的目錄下。
pip install yt-dlp
  1. 日後要執行虛擬環境裡面的程式,都必須先進入才可啟用
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套件。

  1. 參照Github指示,從Linux套件庫安裝pipx:
sudo apt install pipx
  1. 讓pipx將必要路徑加入環境變數
pipx ensurepath
  1. 這樣就可以用pipx安裝原本pip的套件了,例如yt-dlp
pipx install yt-dlp
  1. 安裝後可直接從命令行使用
yt-dlp --version

一些技術性細節:

  • pipx安裝的套件預設會放到~/.local/bin,這裡存放的是各個Pyhton套件的符號連結檔,實際會指向~/.local/share/pipx/venvs/目錄的虛擬環境。因為~/.local/bin被加入環境變數,所以使用者才能從命令行執行pipx安裝的程式。
  • pipx所安裝的套件只有目前使用者可用。若要讓全系統使用者可用,需要使用pipx ensurepath --global
  • 如果你需要在pipx建立的虛擬環境額外安裝套件,請使用pipx inject <虛擬環境名稱> <Python套件名稱>的指令安裝。
  • pipx沒有切換Python版本的功能。

參考資料
#

相關文章

Linux如何解除安裝軟體並刪除乾淨
分類   Linux系統 Linux使用技巧
標籤   Ubuntu Flatpak Snap AppImage
給Linux螢幕進行色彩管理,套用ICC設定檔,調整螢幕顏色的色溫
分類   Linux系統 Linux使用技巧
標籤   Linux Wayland Color Management
musl系發行版Alpine Linux跑glibc程式的方法
分類   Linux系統 Linux使用技巧
標籤   Alpine Linux PostmarketOS

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用圖床網站。