跳至內容
QGIS
疑難排解

QGIS Flatpak 出現 No module named pip?用 --devel 解決

發布於 更新於

透過 Flatpak 搭配 --devel 執行 pip,並使用 --user 安裝。這兩個旗標都有其用途:--devel 會將 runtime 切換為 SDK,pip 實際位於其中;--user 則將檔案寫入 sandbox 允許您寫入的目錄。

/usr/bin/python3: No module named pip

bwrap: execvp pip3: No such file or directory

ERROR: Could not install packages due to an EnvironmentError:
[Errno 30] Read-only file system: '/usr/lib/python3.11/site-packages/urllib3-1.25.9.dist-info'

error: runtime/org.kde.Sdk/x86_64/5.15-22.08 not installed

這四行都來自同一個 sandbox。當您使用 Flathub 的 QGIS 套件 org.qgis.qgis 時,在任何 Linux 發行版上,只要某個外掛要求一個找不到的 Python 套件,而您像處理其他安裝方式一樣改用 pip,就會遇到這些訊息。

快速修復

讀取 QGIS Flatpak 所需的 SDK 分支

執行 flatpak info org.qgis.qgis,查看 Sdk: 那一行。它會提供名稱和分支,例如 org.kde.Sdk/x86_64/6.10。記下分支。不要從本頁或錯誤訊息複製數字:分支會隨每個 QGIS 版本變動。

安裝該確切分支

執行 flatpak install flathub org.kde.Sdk//6.10,並將您剛才讀到的分支放在雙斜線之後。安裝其他分支雖然會順利完成,卻仍然沒有 pip。

安裝套件

flatpak run --devel --command=pip3 org.qgis.qgis install scipy --user

將 scipy 替換為外掛要求的套件。之後每次安裝都保留這兩個旗標。

確認已成功運作

重新啟動 QGIS,開啟「外掛程式」選單,接著開啟「Python 主控台」,輸入 import scipy。您要看到的是空白提示字元回來,因為這表示 QGIS 能讀取您安裝套件的資料夾,而您的外掛也會在那裡找到套件。ModuleNotFoundError 表示檔案落在 QGIS 永遠不會查找的位置,不論 pip 工作時輸出了多麼乾淨的訊息。

修復方法 2:檔案安裝到了 QGIS 搜尋路徑之外

列出 pip 寫入的目錄:

flatpak run --command=python3 org.qgis.qgis -c "import site; print(site.getusersitepackages())"

將它與 QGIS 的 Python 主控台中的 sys.path 比較。如果該目錄不在清單中,安裝在那裡的任何內容都無法匯入,不管 pip 回報成功時看起來多麼正常。從頭到尾看起來安裝記錄檔都十分完美,套件也確實存在磁碟上,只是位於這個 Python 啟動時會讀取的資料夾集合之外。

如果錯誤沒有改變,前往修復方法 3。

修復方法 3:套件會編譯 C 擴充功能

您會在安裝途中遇到編譯器錯誤,而不是 Python 錯誤。SDK 包含編譯器,但不包含所有開發標頭檔,而您也不能從 sandbox 外部提供檔案給它。告訴 pip 拒絕從原始碼建置,改用預先建好的 wheel:

flatpak run --devel --command=pip3 org.qgis.qgis install scipy --user --only-binary=:all:

如果您的平台沒有可用的 wheel,請尋找有發布 wheel 的套件。

如果錯誤沒有改變,前往修復方法 4。

修復方法 4:即使使用 --devel,pip3 仍然遺失

SDK 安裝沒有成功。使用 flatpak list | grep Sdk 確認分支,然後在 sandbox 內建置 pip 作為備用方法:

flatpak run --command=python3 org.qgis.qgis -m ensurepip --upgrade --user

只把它當作備用方法,不要賦予更多意義。沒有來源在此建議這種方式,而且沒有 --devel 時,它會針對 Platform runtime 而不是 SDK 執行。之後回到快速修復的第 3 步。

如果錯誤沒有改變,前往修復方法 5。

修復方法 5:您使用的不是 Flathub build

使用 flatpak info org.qgis.qgis 檢查。如果沒有任何回傳,您的 QGIS 來自其他地方,上述指令都不適用。QGIS 沒有官方 Snap 套件,因此 Snap build 屬於第三方,使用自己的 sandbox 規則。在 Debian 和 Ubuntu 上,請改為從 QGIS 官方儲存庫 安裝,而不是使用 Flathub。QGIS 之後會使用系統 Python,而外掛相依套件可以使用一般 pip 安裝。

如果錯誤沒有改變,請寄給我,下一節會說明信件中要放什麼。

為什麼會發生

Flatpak 使用自己的 Python,與您的發行版安裝的 Python 隔離,因此您使用系統 pip 或 apt 新增的套件,QGIS 看不見。在 sandbox 內,/usr 以唯讀方式掛載。一般的 pip install 會嘗試寫入該處,這就會產生包含 python3.11 路徑的 [Errno 30] 那一行,而 --user 會將相同檔案送到可寫入的目錄。

pip 本身位於 SDK 中,而不是 QGIS 通常啟動的 runtime 中。沒有 --devel 時,根本沒有 pip3 可以執行,因此這個抱怨來自 bwrap,而不是 Python。而且只有在相符的 SDK 已經安裝在您的電腦上時,--devel 才能運作,錯誤區塊的最後一行正是在告訴您這件事。

我們的 AI Segmentation 外掛 會辨識 Flatpak QGIS,並引導您使用「自動」模式。它會在我們的伺服器上執行,不會在您的電腦上安裝任何 Python 套件。

仍然無法運作?

請寄給我三樣東西:使用 flatpak info org.qgis.qgis 查到的 Flatpak QGIS 版本、您執行的確切指令,以及完整輸出,不要只寄最後一行。地址是 stephane.barbot@terra-lab.ai。如果您追蹤的套件是我們的 AI Segmentation 外掛要求的,請在信中說明,因為這會改變我首先檢查上述五種修復方法中的哪一種。

大家常問的問題

為什麼 pip 在我的終端機中可運作,卻在 QGIS 中不行?

您終端機中的 pip 屬於發行版安裝的 Python。Flatpak 有自己的 Python,兩者都看不到對方的套件,因此 apt 和系統 pip 不會改變 QGIS 的狀態。每次安裝都必須透過 flatpak run,這才能將它放進 sandbox 內。

每次安裝都需要 --devel 嗎?

需要。pip3 位於 SDK 中,而不是 QGIS 啟動的 runtime 中,因此沒有 --devel 就沒有任何東西可以執行。每次安裝也都保留 --user,否則您又會寫入唯讀的 /usr,並再次看到 [Errno 30] 那一行。

套件實際會安裝到哪裡?

它們會安裝在 sandbox 內的個人 site 目錄中,修復方法 2 的指令會替您列出該目錄。將該路徑與 QGIS 的 Python 主控台中的 sys.path 比較。位於該清單所有資料夾之外的檔案,QGIS 永遠不會匯入。

是否有官方 QGIS Snap 可供改用?

沒有。snapcraft.io/qgis 回傳 404,而 Snap store 中的 build 屬於第三方。QGIS 說明文件列出 Flatpak、發行版套件和 Spack,因此在 Debian 或 Ubuntu 上,Flathub 的替代方案是 QGIS 官方儲存庫,而不是 Snap。

匯入正常後,您就能回到外掛的使用,而我們的兩款外掛都放在 QGIS AI 中心。Windows 有自己的 QGIS 問題版本,詳見 ImportError: DLL load failed while importing _C in QGIS。