Pythonパッケージを処理するためのPip vs Package Manager

Pythonパッケージは多くのディストリビューションのリポジトリで頻繁にホストされています。 このチュートリアルを読んだ後に、「本当にこれを行いますか? 「私はpipの使用を避け、システムリポジトリを使用することを推奨しました。リポジトリにないパッケージをインストールする必要がある場合にのみpipを使用するようにしました。

しかし、これは矛盾したインストール方法であるため、pipのみを使用する方が良いでしょうか?両方の場所で利用可能なパッケージのためにシステム自身のリポジトリ上でpipを使用することの利点/デトラクターは何ですか?

私が含めたリンク

標準のDebian/NeuroDebianパッケージを常に使うことの利点は、それらのパッケージが互いに互換性があるように慎重にテストされていることです。 Debianパッケージは他のライブラリとの依存関係を記録しているので、インストールの一部として必要なライブラリをいつでも手に入れることができます。

私はアーチを使います。これはapt以外の他のパッケージ管理システムにも当てはまりますか?

21

5 答え

システムモジュールとしてもユーザモジュールとしても、 pip を使用してシステムにPythonモジュールをインストールする場合の最大の欠点は、ディストリビューションのパッケージ管理システムがそれらを認識していないことです。これは、それらがそれらを必要とし、将来インストールするかもしれない(あるいはアップグレード後にこれらのモジュールのうちの1つを使い始めるかもしれない)他のどのパッケージにも使用されないことを意味します。そうすると、 pip と配布管理されたバージョンのモジュールが混在することになり、問題が発生する可能性があります(私は最近この別のインスタンス。ですから、あなたの質問は結局、全か無かという命題になってしまいます。もしあなたがPythonモジュールに pip を使うだけなら、あなたが望むものにディストリビューションのパッケージマネージャを使うことはできません。 Pythonモジュールを使うには...

リンク先のページに書かれている一般的なアドバイスはとても良いです。可能な限りあなたのディストリビューションのパッケージを使うようにしてください。ユーザー設定でシステム全体ではありません。特にモジュール開発には、できる限り仮想環境を使用してください。特にArchでは、古いモジュールによって引き起こされる問題に遭遇するべきではありません。それが問題になる可能性があるディストリビューションでも、仮想環境はそれを非常に簡単に処理します。

ディストリビューションのライブラリとモジュールパッケージは、主にディストリビューション内の他のパッケージを使用するためにパッケージ化されていることを常に考慮する価値があります。これらのライブラリやモジュールを使用して開発する場合、それらを回避することは良い副作用ですが、それが主な使用例ではありません。

22
追加された
pip を使用しないことで発生するリスクは、誤って pip uninstall をディストリビューション管理パッケージにした場合にどうなりますか?
追加された 著者 Sabeen Malik,
@marcelm:あなたがLinuxマシンで、誰かが sudo pip を使わないようにと教えてくれたのではないでしょうか。 > virtualenv )、しかし例えば私はそれが単に当てはまらないところでMSYS2(Windows)を使います。私は2つのpythonパッケージをインストールするための選択肢があります: pacmanpip です。アンインストールに間違ったものを使用するとうまくいかないので、私は何をインストールするのに使用されているかを覚えておく必要があります。
追加された 著者 Sabeen Malik,
私たちがこの二分法または矛盾にある種立ち往生しているという事実は本当に残念です、おそらく私たちはPythonと公式リポジトリでこれを解決するために取り組むべきです
追加された 著者 cat,
@Mehrdadほとんどの場合、(virtualenvと組み合わせて) pip をユーザーとして実行することになります。そのため、システムにインストールされたファイルを台無しにする権限はありません。
追加された 著者 marcelm,

TL、DR

  • pip (+ virtualenv)を使って(lib、フレームワーク、開発ツールなど)あなたのプロジェクト(あなたが開発したもの)を使う
  • あなたが使用するアプリケーション(エンドユーザーとして)にパッケージマネージャを使用する

開発依存関係

Pythonでソフトウェアを開発しているのであれば、ランタイムの依存関係、ビルド時の依存関係、自動テストや自動コンプライアンスチェックに必要なものなど、プロジェクトのすべての依存関係に pip を使用するとよいでしょうリンター、スタイルチェッカー、静的型チェッカー...)

これにはいくつかの理由があります。

  • これで virtualenv (直接またはvirtualenvwrapper、pipenv、その他の方法で)を使用して異なるプロジェクトの依存関係を相互に分離したり、 "運用中"で使用したpythonアプリケーションを分離したりできます(開発中に発生する可能性のある、すべてのエキゾチックな狂信者(あるいは単なる非互換性)からのユーザーとして)
  • これにより、プロジェクトのすべての依存関係を Requirements.txt (プロジェクトがアプリケーションの場合)または setup.py (プロジェクトがアプリケーションの場合)で追跡できます。ライブラリまたはフレームワーク)ファイル。これはソースコードと一緒にリビジョン管理(例:Git)にチェックインできるので、あなたは常にあなたのコードのどのバージョンがあなたの依存関係のどのバージョンに依存しているかを知ることができます。
  • 他の開発者が同じLinuxディストリビューションや同じオペレーティングシステムを使用していなくても(使用されている依存関係がMacやWindowsで使用可能な場合、あるいは使用されているものは何でも)それは)
  • オペレーティングシステムのパッケージマネージャを自動的に更新してもコードが破損することは望ましくありません。あなたはあなたの依存関係を更新するべきですが、あなたはあなたのコードを修正するか更新をロールバックする準備ができるようにあなたはそれを意識的にそして時々選択するべきです。 (リビジョン管理システムで完全な依存関係の宣言をコードと一緒に追跡すれば、これは簡単です。)

直接的な依存関係と間接的な依存関係を分ける必要があると思う場合(または依存関係の許容バージョン範囲と実際に使用されるバージョンを区別する、 "version pinning"を参照)は、pip-toolsやpipenvを調べます。これにより、ビルド依存関係とテスト依存関係を区別することもできます。 (ビルド依存関係とランタイム依存関係の違いは、おそらく setup.py でエンコードできます)

使用するアプリケーション

あなたが普通のアプリケーションとして使っているものや、Pythonで書かれているだけのものであれば、あなたのオペレーティングシステムのパッケージマネージャを好むでしょう。パッケージマネージャによってインストールされた他のものと合理的に最新かつ互換性があることを確認します。ほとんどのLinuxディストリビューションはまた、マルウェアを配布していないと主張するでしょう。

必要なものがディストリビューションのデフォルトのパッケージレポジトリで利用できない場合は、追加のパッケージレポジトリ(debベースのディストリビューションのランチパッドなど)をチェックアウトするか、とにかく pip を使用してください。後者の場合は、システム全体ではなく --user を使用してユーザーの自宅にインストールします。そのため、Pythonのインストールが中断される可能性が低くなります。 (あなたが一時的に必要とすることはめったにないもののために、あなたはvirtualenvを使うことさえできます。)

8
追加された

あなたが書いているコードで使うためにpythonパッケージをインストールすることについて話しているのなら、pipを使ってください。

作業しているプロジェクトごとに仮想環境を作成してから、pipを使用してそのプロジェクトに必要なものだけをインストールします。そのようにして、あなたは一貫した方法であなたが使うすべてのライブラリをインストールします、そしてそれらは含まれていて、あなたのパッケージマネージャを通してインストールするものを妨害しません。

Pythonコードをリリースする予定の場合は、通常、 setup.py または requirements.txt をプロジェクトに追加します。これにより、pipが自動的に取得されます。それはすべて依存関係です。そのプロジェクト用の仮想環境を簡単に作成または再作成することができます。

7
追加された

パッケージマネージャを使用するもう1つの理由は、アップデートが自動的に適用されることです。これはセキュリティにとって非常に重要です。 Equifaxが使用しているBeansパッケージがyum-cron-securityを介して自動的に更新されたかどうか考えてみてください。

私の個人的な開発用ボックスではPipを使用していますが、prodではパッケージを使用しています。

7
追加された
どちらを使うかは、あなたの制作環境によっても異なります。また、ディストリビューションによっては、パッケージマネージャが新しいバージョンを追加するのに時間がかかることがあるため、セキュリティ更新プログラムが実際には代わりにpipを使用する理由になる場合があります。
追加された 著者 user295006,

概要

あなたが扱っているモジュールの3つの一般的なカテゴリーがあります:

  1. OSパッケージシステムを使用しているすべてのユーザーにインストールされるサポートプログラム。 (これには、Pythonでプログラミングを行う人々が使用するツールやライブラリも含まれます。以下を参照してください。)これらのために、あなたはできる限りOSパッケージを使い、必要なら pip をシステムディレクトリにインストールします。 >
  2. 特定のユーザーが自分のためだけに、そしてスクリプト言語としてのPythonの "日常"使用のためにだけインストールされた、それらをサポートするプログラム。彼女らは pip --user 、おそらく pyenvpythonz 、および同様のツールと戦術。
  3. 特定のアプリケーションの開発と使用をサポートしている人。これらのためには virtualenv (あるいは同様のツール)を使います。

ここの各レベルはまた前のレベルからサポートを得ているかもしれません。例えば、(2)の私達のユーザーはOSパッケージ経由でインストールされたPythonインタプリタに頼っているかもしれません。

もう少し詳しく説明します。

システムプログラムとパッケージ

あなたが「ただ実行したい」というPythonで書かれたプログラムは簡単です。OSインストールツールを使って、必要なものは何でも持ってくるようにするだけです。これはPython以外のプログラムと同じです。これはあなたのマシン上のユーザが頼りになるかもしれないPythonツール/ライブラリ(Pythonインタプリタ自体のような!)を持ち込む可能性があります。依存関係を理解し​​、理想的にはそれらの依存関係を提供しないホスト上でそれを処理するための代替手段を知っている限り、これは問題ではありません。

そのような依存関係の一般的で単純な例は、#/!/ usr/bin/env python で始まる〜/ .local/bin/にある私の個人用スクリプトです。これらはRH/CentOS 7およびほとんど(すべてではありません)のUbuntuインストール環境で(Python 2で動作する限り)問題なく動作します。彼らは基本的なDebianのインストールやWindows上ではありません。私の個人的な環境がOSパッケージへの依存性の面で多くの邪魔をしているのが嫌いなので(私はいくつかの異なるOSで作業しています)、このようなことはかなり許容できると思います。システムPythonを持っていないし、入手できない稀なホスト上での私のバックアップ計画は、下記のようにユーザーシステムを使うことです。

システムのPythonインタプリタを使用している人は、通常システム pip3 にも依存しています。それは私が普段私のシステム依存関係に線を引くところです。 virtualenv 以降のすべては私が担当します。 (たとえば、私の標準スクリプトを有効にするはパスに含まれる pip3 または pip に依存しますが、仮想環境をブートストラップするために virtualenv の独自のコピーをダウンロードします。作成中です。

そうは言っても、より多くの開発環境を利用可能にすることが完全に合理的な状況がおそらくあるでしょう。あなたはそれのシステムバージョンを使いたい複雑なパッケージ(DBMSのような)へのPythonインタフェースを持っているかもしれません、そしてあなたがそれに話すために使う特定のPythonライブラリコードもシステムに選ばせるのが最善だと思います。あるいは、Pythonクラス用の基本的な開発環境を備えた多数のホストをデプロイしている場合は、標準のシステムパッケージを使用して自動化するのが最も簡単です。

ユーザーの "日常的な"プログラムとパッケージ

そもそも仮想環境の作成を手助けしたいので、ユーザーは仮想環境にはあまり合わないPythonライブラリやプログラムを持っているかもしれません(例: virtualenvwrapper )またはPython以外の作業をしているときでも、コマンドラインからよく使用されるものです。たとえ彼らがこれらのシステムバージョンをインストールする能力を持っていたとしても、彼らは彼ら自身のインストールをより快適に感じるかもしれません(例えば、彼らはツールとその依存関係の最新バージョンを使いたいので)。

一般的には pip --user がこのために使われますが、Pythonインタプリタ自体のようなある種の依存関係はそれより少し多くを必要とします。 pyenvpythonz は個人的なインタプリタ(デフォルトのインタプリタとして〜/ .local/bin にインストールされているかどうかに関わらず)を構築するのに便利です。 devライブラリが利用可能な場合は、手で "ソースから"

私はここにインストールされているものの最小限のセットを保つようにしています:virtualenvwrapper(私はそれを絶えず使用しているので)そしておそらく最新バージョンのpip。私が書く個人的なスクリプトが多くのホストで使われるようにするために、私は標準ライブラリの外やPython 3への依存を避けようとしています。 (ただし、これらの個人用スクリプトの多くをPythonに移行するにつれて、それをどれだけ長く耐えられるかがわかります。)

個別のアプリケーション開発環境とランタイム環境

これは通常のvirtualenvのことです。開発には、ほとんどの場合virtualenvを使用してシステムの依存関係を使用しないようにするか、または異なるPythonバージョンに対してテストするために複数回使用することをお勧めします。

これらの仮想環境は、ユーザー環境の汚染を避けたい、依存関係が多いアプリケーションにも適しています。たとえば、私は通常 Jupyter ノートブックなどを実行するためのvirtualenvを設定します。

1
追加された