MEP11: サードパーティの依存関係#

この MEP は、matplotlib のサードパーティの依存関係を処理する方法を改善しようとします。

ステータス番号

完了-- マージする必要があります

ブランチとプルリクエスト#

#1157: 自動依存関係解決を使用する

#1290: Debundle pyparsing

#1261: 6 を 1.2 に更新

アブストラクト#

matplotlib の目標の 1 つは、できるだけ簡単にインストールできるようにすることです。そのために、いくつかのサードパーティの依存関係がソース ツリーに含まれており、特定の状況下では、matplotlib と一緒にインストールされます。この MEP は、インストールを便利にし続けながら、そのアプローチに関するいくつかの問題を解決し、ある程度の一貫性をもたらすことを目的としています。

これが最初に行われた時点では、setuptoolseasy_install、および PyPIは信頼できるほど成熟していませんでした。ただし、現時点では、これらのツールの「最新」バージョンであるdistributedpipを安全に活用できるはずです。

matplotlib は Python ライブラリと C/C++ ライブラリの両方に依存していますが、この MEP は問題を混乱させないように Python ライブラリのみに対応しています。C ライブラリは、大規模でほぼ直交する一連の問題を表します。

詳細な説明#

matplotlib は、次のサードパーティの Python ライブラリに依存しています。

  • ナンピー

  • dateutil (純粋な Python)

  • pytz (純粋な Python)

  • six -- dateutil で必要 (純粋な Python)

  • pyparsing (純粋な Python)

  • PIL (オプション)

  • GUI フレームワーク: pygtk、gobject、tkinter、PySide、PyQt4、wx (すべてオプションですが、対話型 GUI には 1 つ必要です)

現在の動作#

ソースからインストールする場合、git checkout またはpip :

  • setup.pyしようとします。これが失敗すると、インストールは失敗します。import numpy

  • dateutilpytz、およびsixのそれぞれについて、setup.pyそれらを (トップレベルの名前空間から) インポートしようとします。それが失敗した場合、matplotlib はライブラリのローカル コピーを最上位の名前空間にインストールします。

  • pyparsingは、常に matplotlib 名前空間内にインストールされます。

この動作はpipで 使用すると最も驚くべきものになります。これは、これらのすべてのパッケージで機能する可能性が高いにもかかわらず、pip依存関係の解決が実行されないためです。

pyparsingが matplotlib 名前空間にインストールされているという事実(#1290) は、一部のユーザーを混乱させて、それが matplotlib 関連のモジュールであると考えさせ、最上位ではなくそこからインポートするようにしました。

Windows インストーラーを使用してインストールすると、dateutilpytz、および sixが最上位のalwaysにインストールされ、既にインストールされているこれらのライブラリのコピーが上書きされる可能性があります。

TODO: OS-X インストーラーの動作について説明します。

パッケージ マネージャー (Debian、RedHat、MacPorts など) を使用してインストールする場合、この動作は実際には正しいことを行います。matplotlib パッケージには、 dateutilpytz、およびsixをこのように処理するという事実に対処するための特別なパッチはありません。. ただし、どのようなアプローチに移行しても、そのコンテキストで機能し続けることに注意する必要があります。

これらのパッケージを matplotlib ツリーで維持し、それらが最新であることを確認することは、メンテナンスの負担です。サードパーティの純粋な Python ライブラリを必要とする可能性のある高度な新機能は、この負担のために含めることへのより高い障壁があります。

望ましい動作#

サードパーティの依存関係は、pipdistributed、およびPyPIを利用して、正規の場所からダウンロードおよびインストールされます。

dateutilpytz、およびpyparsingはオプションの依存関係にする必要がありますが、それらがインストールされていないと失敗する機能もあります。これにより、ユーザーは特定の機能をわざわざインストールするかどうかを決定できます。

実装#

ソースからインストールする場合、およびユーザーがすべての C レベル コンパイラと依存関係を持っていると仮定すると、 distributeを使用し、こちらの手順に従うことで、これをかなり簡単に行うことができます。matplotlib ライブラリ コードへの唯一の予想される変更は、matplotlib 内からではなく、最上位の名前空間からpyparsingをインポートすることです。厳密に言えば、これは dateutilの直接的な依存関係にすぎないため、 distributedを使用すると、 sixへの直接的な依存関係を削除することもできることに注意してください。

バイナリ インストールの場合、いくつかの代替手段があります (ここでは、最良/最も難しいものから最も悪い/最も簡単なものの順に並べています)。

  1. distutils wininst インストーラーを使用すると、インストール後のスクリプトを実行できます。このスクリプトを取得してpipを実行し、他の依存関係をインストールできる場合があります。( 以前にその地面を踏んだことがある人については、このスレッドを参照してください)。

  2. dateutilpytzsix、およびpyparsingをインストーラーで出荷し続けますが、post-install-script を使用して、 まだ見つからない場合にのみインストールしてください。

  3. これらのパッケージをすべて (新しい)matplotlib.extern 名前空間内に移動して、これらが外部パッケージであることを外部のユーザーに明確に示します。コアの matplotlib コードベースにいくつかの条件付きインポートを追加して、dateutil (トップレベル) が最初に試行され、失敗するとそれmatplotlib.extern.dateutilが使用されるようにします。

2 と 3 は、ツリーにこれらのパッケージのコピーを維持する必要があるため、望ましくありません。これは、バイナリ インストーラーでのみ使用されることが少ないという事実によって悪化します。これら 3 つのアプローチのいずれも、インストーラーを使用して手動でインストールする必要がある Numpy に対応していません。

TODO: これは Mac OS-X インストーラーとどのように関連していますか?

下位互換性#

現在、matplotlib は、サードパーティの依存関係やインターネット接続なしで、ソースからマシンにインストールできます。この変更後、初めて matplotlib をインストールするには、インターネット接続 (および動作する PyPI) が必要になります。(その後の matplotlib の更新または開発作業は、ネットワークにアクセスせずに実行されます)。

代替案#

バイナリの卵を配布することは、使用可能なソリューションとは思えません。これにはまずeasy_installをインストールする必要があり、Windows ユーザーは通常、すぐに使えるよく知られたインストーラーを好み.exeます.msi