如何阻止 pip 和 python 用戶包

如何阻止 pip 和 python 用戶包

我試圖阻止用戶使用 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

文件用於PYTHONNOUSERSITE聲明:

如果設定了此項,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基本(即非虛擬)環境中的安裝。當它可以這樣做(希望當上面鏈接的問題解決時)可以使用-sPYTHONNOUSERSITE=1環境變量,但是我認為您正在尋找的“sys-admin”執行此操作的方法是修改直接 site.py,如 site.py 實作中所述

答案2

舊線程,但這裡是可能的解決方案..強制 pip 有虛擬環境,而不是直接安裝在用戶站點上。

export PIP_REQUIRE_VIRTUALENV=true

這是相關連結: https://docs.python-guide.org/dev/pip-virtualenv/

相關內容