web-dev-qa-db-ja.com

ストレッチdebianでpipをアップグレードする正しい方法は何ですか?

Sudoコマンドを使用してpipアップグレードを行うのは良い考えではないといういくつかの注意事項を確認しました。私の質問は、私がSudoを与えないと許可エラーが発生することです。どうすればこれを解決できますか?また、pipをアップグレードするためにSudoが推奨されない理由は何ですか?

$python -m pip install --upgrade pip
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
Collecting pip
  Using cached https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 19.2.3
    Uninstalling pip-19.2.3:
      Successfully uninstalled pip-19.2.3
  Rolling back uninstall of pip
  Moving to /home/abc/.local/bin/pip
   from /tmp/pip-uninstall-V4F8Pj/pip
  Moving to /home/abc/.local/bin/pip2
   from /tmp/pip-uninstall-V4F8Pj/pip2
  Moving to /home/abc/.local/bin/pip2.7
   from /tmp/pip-uninstall-V4F8Pj/pip2.7
  Moving to /home/abc/.local/lib/python2.7/site-packages/pip-19.2.3.dist-info/
   from /home/abc/.local/lib/python2.7/site-packages/~ip-19.2.3.dist-info
  Moving to /home/abc/.local/lib/python2.7/site-packages/pip/
   from /home/abc/.local/lib/python2.7/site-packages/~ip
ERROR: Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/pip-20.0.2.dist-info/top_level.txt'
Consider using the `--user` option or check the permissions.

WARNING: You are using pip version 19.2.3, however version 20.0.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
6
kurramkurram D

OSが提供するバージョンのツールをパッケージ管理システム外でアップグレードしないでください。新しいパッケージがリリースされると、変更が上書きされるためです。

したがって、Sudo pip install --upgrade pipは悪いことです。 OSパッケージシステムはそれがファイルを制御していると信じており、あなたはそれらを上書きしました。以前にインストールしたバージョンよりも古いバージョンのインストールなど、奇妙な動作が発生する可能性があります!

新しいバージョンが必要な場合は、ユーザープロファイルにインストールできます。

% pip install --upgrade --user pip
Collecting pip
  Downloading https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2-py2.py3-none-any.whl (1.4MB)
    100% |################################| 1.4MB 615kB/s 
Installing collected packages: pip
Successfully installed pip-20.0.2

これにより、$HOME/.local/binの最新バージョンがインストールされます

% ls -l .local/bin/pip                                           
-rwxr-xr-x 1 sweh sweh 223 Feb 16 21:49 .local/bin/pip

PATHに$HOME/.local/binがある場合は、常にユーザーのpipインストール済みプログラムを取得します。

ただし、ほとんどの場合、pipをアップグレードするためにneedを行う必要はありません。

11
Stephen Harris

Stephensの回答に加えて、pip(つまり、Sudo pip install foo)を使用してパッケージをグローバルにインストールしないでください。これは、pipのアップグレードと同様に、配布によって提供されるファイルに干渉し、潜在的な競合を引き起こします。

Pythonパッケージの場合、2つの実行可能な戦略がありますが、これらを混在させることはできません。1つを選択してください。状況に応じて、一方から他方に切り替えることができます。

1)Debian提供のパッケージのみを使用する

つまり、何でもapt installできます。 PILが必要ですか? apt install python-pilまたはapt install python3-pil。これにより、すべてのファイルがDebianによって正しく管理され、Debianの残りのパッケージと一緒に無料のセキュリティサポートを受けられます。とにかく、7月までは、Stretchがセキュリティサポートを失い始めるまでです。

これは、パッケージの少し古いバージョンを受け入れる必要があることを意味します。場合によっては、必要なパッケージをまったく見つけられないことがあります。おそらく、これはpip --userを使用してインストールされたパッケージで補足でき、Stephenが説明しているように、私はこれを試していません。

2)virtualenvを使用する

Python仮想環境(Sudo apt install virtualenv; virtualenv venv; source venv/bin/activate)を設定できます。このvirtualenv内にパッケージをインストール(またはpipをアップグレード)でき、そのようなインストールはすべてそのvirtualenvに完全に含まれます。これは、さまざまなプロジェクトにさまざまなバージョンのパッケージを使用でき、PyPiにあるものはすべて利用できることを意味します。rm -r venv/は、パッケージを含む仮想環境全体を削除します。OSファイルとの競合はありません。

このアプローチにより、プロジェクトに必要なものがより明確になり、管理が容易になります。一方、セキュリティ修正のためにこれらのパッケージを更新する負担はあなたの負担になります。これは小規模な1回限りのプロジェクトにはやや強引ですが、特定の場合に非常に役立ちます。

2
marcelm