我試圖阻止用戶使用 pip 在其主目錄中安裝軟體包。
的輸出python3 -m site --help
將表明超級用戶可以停用用戶網站目錄。但這是如何做到的呢?我嘗試site.ENABLE_USER_SITE
過從 a設置sitecustomize.py
,但這沒有幫助。PYTHONNOUSERSITE=1
在環境中設定或傳遞-s
給 python 可以工作,但不完全是超級使用者調整。
我還嘗試透過某種方式為用戶停用 pip 來解決這個問題。我們很高興將軟體包安裝到 venv 環境中,而不是用戶主目錄中。有什麼可以pip.conf
強制停用--user
安裝的內容嗎?
答案1
問:我可以在 pip.conf 中新增任何內容來強制停用 --user 安裝嗎?
A:不會。點文件:
命令列選項優先於環境變量,環境變數優先於設定檔。
問:超級使用者可以停用使用者網站目錄。但這是如何做到的呢?PYTHONNOUSERSITE=1
在環境中設定或傳遞-s
給 python 可以工作,但不完全是超級使用者調整。
A:我透過 Google 提出這個問題,因為我發現了完全相反的情況 - 我沒有看到PYTHONNOUSERSITE
實際改變 pip 的行為:
$ docker run --net=host -it python:3.8 bash
$ pip install -U pip
Requirement already up-to-date: pip in /usr/local/lib/python3.8/site-packages (20.2.2)
$ ls -ltr ~/.local
ls: cannot access '/root/.local': No such file or directory
$ PYTHONNOUSERSITE=1 pip install --user typing-extensions
Collecting typing-extensions
Downloading typing_extensions-3.7.4.3-py3-none-any.whl (22 kB)
Installing collected packages: typing-extensions
Successfully installed typing-extensions-3.7.4.3
$ ls -ltr ~/.local
total 4
drwxr-xr-x 3 root root 4096 Aug 24 07:08 lib
如果設定了此項,Python 不會將使用者 site-packages 目錄新增至 sys.path 中。
因此,儘管我對這種行為感到驚訝,但我認為即使設置了此變量,pip 仍然安裝是合理的PYTHONUSERBASE
(即使結果是已安裝套件在 Python 路徑上不可用)。
我找到了一個pip問題追蹤器上的相關問題看起來 venvs 已經有一個特殊情況,它禁用了系統站點包(預設),不允許進行用戶安裝(我沒有明確檢查這一點)。
因此,根據原始錯誤報告的解決方案,我們得到了一個拉取請求,其中包含一些內容有趣的功能。也就是說,顯然有一個超級用戶可以創建的特殊檔案````,它會禁用用戶站點包安裝。我還找到了一個與此相關的 SO 問題。所以我嘗試了這個,但不幸的是它仍然繼續安裝到用戶群中:
$ touch /usr/local/lib/python3.8/no-global-site-packages.txt
$ pip install --user typing-extensions
...
Successfully installed typing-extensions-3.7.4.3
當然,當我們閱讀實際內容時,這是有道理的拉取請求實施它僅在 virtualenv 情況下檢查此文件。就我而言,我希望能夠總是禁用此行為,所以我將深入研究 pip 程式碼庫......
事實證明關鍵函數是decide_user_site
, 哪個做尊重site.ENABLE_USER_SITE
值,但是僅有的在檢查了顯式user
參數之後。正如我們在函數本身中看到的,這與虛擬環境的處理方式不對稱,如果虛擬環境禁用了全局/用戶安裝,這將阻止它們。我認為這是一個錯誤,我已將其提出https://github.com/pypa/pip/issues/8794。
所以答案是:據我所知,目前不可能停用--user
基本(即非虛擬)環境中的安裝。當它是可以這樣做(希望當上面鏈接的問題解決時)可以使用-s
和PYTHONNOUSERSITE=1
環境變量,但是我認為您正在尋找的“sys-admin”執行此操作的方法是修改直接 site.py,如 site.py 實作中所述。
答案2
舊線程,但這裡是可能的解決方案..強制 pip 有虛擬環境,而不是直接安裝在用戶站點上。
export PIP_REQUIRE_VIRTUALENV=true