pipとpythonのユーザーパッケージをブロックするにはどうすればいいですか

pipとpythonのユーザーパッケージをブロックするにはどうすればいいですか

ユーザーが pip を使用してホーム ディレクトリにパッケージをインストールするのを防止しようとしています。

からの出力は、python3 -m site --helpスーパーユーザーがユーザーサイトディレクトリを無効にできることを示しています。しかし、これはどのように行うのでしょうか?site.ENABLE_USER_SITEから設定してみましたsitecustomize.pyが、役に立ちませんでした。PYTHONNOUSERSITE=1環境で設定したり、-sPython に渡したりすることはできますが、スーパーユーザーの調整とは言えません。

また、何らかの方法でユーザーに対して pip を無効にすることで、この問題に対処しようとしました。パッケージが venv 環境にインストールされても構いませんが、ユーザーのホーム ディレクトリにはインストールされないようにしたいです。インストールをpip.conf強制的に無効にするために何かできることはありますか--user

答え1

質問:--user インストールを強制的に無効にするために pip.conf に追加できるものはありますか。

答え:いいえ。設定ファイルは、pip ドキュメント:

コマンドライン オプションは環境変数よりも優先され、環境変数は構成ファイルよりも優先されます。

質問:スーパーユーザーはユーザーサイトディレクトリを無効にすることができます。しかし、これはどのように行うのでしょうか?PYTHONNOUSERSITE=1環境で設定するか、-sPython に渡すことはできますが、スーパーユーザーによる調整とは言えません。

答え:PYTHONNOUSERSITE私は Google を通じてこの質問にたどり着きました。なぜなら、まったく逆のことを見つけていたからです。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

もちろん、実際のところを読んでみると、これは理にかなっています。プルリクエストの実装これは仮想環境下でのみこのファイルをチェックします。私の場合、いつもこの動作を無効にするには、pip コードベースをもう少し詳しく調べます...

重要な機能はdecide_user_site、 どれのする尊重するsite.ENABLE_USER_SITE価値はあるがのみ明示的な引数をチェックした後user、関数自体でわかるように、これは仮想環境の処理方法とは非対称であり、仮想環境がグローバル/ユーザーインストールを無効にしている場合はインストールが妨げられます。これはバグだと私は考えており、pypa の最新バージョンは 8794 です。

--user答えはこうです。私の知る限り、ベース(つまり非仮想)環境でインストールを無効にすることは現時点では不可能です。(うまくいけば、上記のリンクの問題が修正されれば)-s環境PYTHONNOUSERSITE=1変数を使用できますが、あなたが探している「システム管理者」の方法は、変更することです。site.pyの実装で説明されているように、site.pyを直接実行します。

答え2

古いスレッドですが、ここに解決策があります。pip に仮想環境を強制し、ユーザー サイトに直接インストールしないようにします。

export PIP_REQUIRE_VIRTUALENV=true

関連リンクはこちらです: python-guide.org/dev/pip-virtualenv/ を参照してください。

関連情報