Pythonには、プロジェクトのパッケージ化と記述に使用できるツールの混乱した歴史があります。これらには、標準ライブラリのdistutils
、distribute
、distutils2
、およびsetuptools
(およびもっと)。 distribute
とdistutils2
は、setuptools
を支持して廃止されたようです。これにより、2つの競合する標準が残ります。
私の理解では、setuptools
はdistutils
よりもはるかに多くのオプション(たとえば、依存関係、テストなどの宣言)を提供しますが、Python標準ライブラリには含まれていません(まだ?)。
Pythonパッケージングユーザーガイド[ 1 ]が推奨するもの:
setuptools
を使用して、プロジェクトを定義し、ソース配布を作成します。
そして説明します:
多くのプロジェクトでpure
distutils
を使用できますが、他のプロジェクトへの依存関係の定義をサポートせず、setuptools
によって提供されるパッケージメタデータを自動的に正しく入力するためのいくつかの便利なユーティリティがありません。 setuptoolsは、標準ライブラリの外側にあるため、Pythonの異なるバージョン間でより一貫した機能セットを提供し、(distutils
とは異なり)setuptools
を更新して、すべてのバージョンで次の「Metadata 2.0」標準フォーマットを生成しますサポートされているバージョン。
distutils
を使用することを選択したプロジェクトでも、pipがそのようなプロジェクトをソースから直接インストールする場合(ビルド済みのホイールファイルからインストールするのではなく)、実際にはsetuptools
を使用してプロジェクトをビルドします。
ただし、さまざまなプロジェクトのsetup.pyファイルを調べると、これは実際の標準ではないようです。多くのパッケージはまだdistutils
を使用しており、setuptools
をサポートするパッケージでは、setuptools
とdistutils
が混在することがよくあります。フォールバックインポートを実行します。
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
setuptools
とdistutils
の両方でインストールできるセットアップを記述する方法を見つける試みが続きます。 distutils
はセットアップ関数の依存関係をサポートしていないため、これには多くの場合、エラーが発生しやすい依存関係チェックのさまざまな方法が含まれます。
なぜ人々はまだdistutils
をサポートするために余分な努力をしているのですか-setuptools
が標準ライブラリにないという事実が唯一の理由ですか? distutils
の利点は何ですか?setuptools
のみをサポートするsetup.pyファイルを書くことには欠点があります。
このSOの質問をご覧ください。それはすべてのパッケージング方法を非常によく説明しており、あなたの質問にある程度答えるのに役立つかもしれません: distribute、distutils、setuptools、distutils2の違い?
Distutilsは、Pythonでのパッケージ化の標準ツールです。標準ライブラリ(Python 2およびPython 3.0から3.3)に含まれています。単純なPythonディストリビューションには便利ですが、機能がありません。 setup.pyスクリプトにインポートできるdistutils Pythonパッケージを紹介します。
Setuptoolsは、Distutilsの制限を克服するために開発されたもので、標準ライブラリには含まれていません。 easy_installと呼ばれるコマンドラインユーティリティを導入しました。また、setup.pyスクリプトにインポートできるsetuptools Pythonパッケージと、ディストリビューションと共にインストールされたデータファイルを見つけるためにコードにインポートできるpkg_resources Pythonパッケージも導入しました。 。その落とし穴の1つは、distutils Pythonパッケージにモンキーパッチを適用することです。 pipでうまく機能するはずです。最新バージョンは2013年7月にリリースされました。
したがって、setuputilsはdistutilsよりも優先されるはずであり、質問の出所はわかりますが、distutilsはすぐにサポートを失うことはありません、簡単に言えば、人気のあるレガシープログラムで使用されることが多いためです。おそらくご存知のように、レガシープログラムでこれらの種類の変更を行うのは非常に苦痛であり、非互換性などのいくつかの問題が発生する可能性があり、開発者はソースコードを書き直す必要があります。そのため、distutilsは標準のpythonライブラリの一部であり、setuptoolsはそうではないという事実もあります。したがって、pythonプログラムを作成する場合は、この時代にsetuptoolsを使用してください。ただし、distutilsがなければ、setuptoolsは存在しなかったことに留意してください。
唯一の理由は、setuptoolsが標準ライブラリにないという事実です
それが一つの理由です。以下は NumPy setup.py
から直接のものです。
if len(sys.argv) >= 2 and ('--help' in sys.argv[1:] or
sys.argv[1] in ('--help-commands', 'Egg_info', '--version',
'clean')):
# Use setuptools for these commands (they don't work well or at all
# with distutils). For normal builds use distutils.
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
したがって、NumPyは、setuptools
を見つけることができればそれを好みます。しかし、SciPyは、状況によってはdistutils
を優先するために patched になるまでこれを行っていました。コミットログの引用:
Setuptools sets mode +x on the test scripts, so that Nose refuses to run
them. Better not do that.
もちろん、setuptools
とdistribute
の間の merger は、これらすべてを期限内に解決するはずですが、多くのパッケージは依然としてPython 2.6インストールをサポートする必要があります。
Setuptoolsが間違いなく優れたツールセットであるにもかかわらず、私たちがまだdistutilsについて話し、使用しているいくつかの理由があります。
まず、distutilsはどこでも利用できます。他のユーザーと共有するためのモジュールを構築しようとしており、複雑な要件がない場合は、作業マシンで使用できることが保証されています。これは、古いバージョンのpythonをサポートする必要がある場合や、なじみのない環境で作業している場合に特に重要です。
第二に、setuptoolsはdistutilsの機能強化を提供します。したがって、distutilsツールセットをモデルにして、そこからすべての構造を取得します。 setuptoolsのドキュメントでは、読者がdistutilsに精通していることを前提としており、distutilsがベースツールセットをどのように拡張するかのみをドキュメント化しています。 distutilsが方言を定義し、setuptoolsがその方言を強化すると考えることができます。
新しいプロジェクトに対する私の個人的なアプローチは、distutilsを使用するという前提から始まります。プロジェクトがsetuptoolsの機能を必要とするように成長した場合にのみ、アップグレードを行います。 setuptoolsはdistutilsのドロップイン交換であり、setup.pyを1行変更するだけです。
基本的には、責任分担によるものです。
setuptools
はPython標準ライブラリの一部ではありません。これは、Pythonコアチームではなく、サードパーティによって維持されているためです。これは、とりわけ、以下を意味します。
実質的に、コアチームはdistutilsの範囲を絞り込み、「コア標準」と「最小限必要なコンパイル」部分を確保していますそれ以上のすべてのものを残しながら(拡張コンパイラ/パッケージ形式/何でもサポート)サードパーティに。以前にそれらの「拡張部分」をカバーしていたコードは、後方互換性のために古くなったままでした。
Pythonモジュールの配布— Python 2.7.12ドキュメント :
distutils
の直接使用は段階的に廃止されますが、現在のパッケージングおよび配布インフラストラクチャの基盤を構築し、標準ライブラリの一部であるだけでなく、その名前は他の方法(たとえば、 Pythonパッケージング標準の開発を調整するために使用されるメーリングリストの名前。
他のOSのパッケージも同様に、setuptools
とpip
を別々に提供します-前述の理由