web-dev-qa-db-ja.com

setuptoolsとdistutils:なぜdistutilsがまだ問題なのですか?

Pythonには、プロジェクトのパッケージ化と記述に使用できるツールの混乱した歴史があります。これらには、標準ライブラリのdistutilsdistributedistutils2、およびsetuptools(およびもっと)。 distributedistutils2は、setuptoolsを支持して廃止されたようです。これにより、2つの競合する標準が残ります。

私の理解では、setuptoolsdistutilsよりもはるかに多くのオプション(たとえば、依存関係、テストなどの宣言)を提供しますが、Python標準ライブラリには含まれていません(まだ?)。

Pythonパッケージングユーザーガイド[ 1 ]が推奨するもの:

setuptoolsを使用して、プロジェクトを定義し、ソース配布を作成します。

そして説明します:

多くのプロジェクトでpure distutilsを使用できますが、他のプロジェクトへの依存関係の定義をサポートせず、setuptoolsによって提供されるパッケージメタデータを自動的に正しく入力するためのいくつかの便利なユーティリティがありません。 setuptoolsは、標準ライブラリの外側にあるため、Pythonの異なるバージョン間でより一貫した機能セットを提供し、(distutilsとは異なり)setuptoolsを更新して、すべてのバージョンで次の「Metadata 2.0」標準フォーマットを生成しますサポートされているバージョン。

distutilsを使用することを選択したプロジェクトでも、pipがそのようなプロジェクトをソースから直接インストールする場合(ビルド済みのホイールファイルからインストールするのではなく)、実際にはsetuptoolsを使用してプロジェクトをビルドします。

ただし、さまざまなプロジェクトのsetup.pyファイルを調べると、これは実際の標準ではないようです。多くのパッケージはまだdistutilsを使用しており、setuptoolsをサポートするパッケージでは、setuptoolsdistutilsが混在することがよくあります。フォールバックインポートを実行します。

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

setuptoolsdistutilsの両方でインストールできるセットアップを記述する方法を見つける試みが続きます。 distutilsはセットアップ関数の依存関係をサポートしていないため、これには多くの場合、エラーが発生しやすい依存関係チェックのさまざまな方法が含まれます。

なぜ人々はまだdistutilsをサポートするために余分な努力をしているのですか-setuptoolsが標準ライブラリにないという事実が唯一の理由ですか? distutilsの利点は何ですか?setuptoolsのみをサポートするsetup.pyファイルを書くことには欠点があります。

126
cel

この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は存在しなかったことに留意してください。

70
user3429036

唯一の理由は、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.

もちろん、setuptoolsdistributeの間の merger は、これらすべてを期限内に解決するはずですが、多くのパッケージは依然としてPython 2.6インストールをサポートする必要があります。

11
Fred Foo

Setuptoolsが間違いなく優れたツールセットであるにもかかわらず、私たちがまだdistutilsについて話し、使用しているいくつかの理由があります。

まず、distutilsはどこでも利用できます。他のユーザーと共有するためのモジュールを構築しようとしており、複雑な要件がない場合は、作業マシンで使用できることが保証されています。これは、古いバージョンのpythonをサポートする必要がある場合や、なじみのない環境で作業している場合に特に重要です。

第二に、setuptoolsはdistutilsの機能強化を提供します。したがって、distutilsツールセットをモデルにして、そこからすべての構造を取得します。 setuptoolsのドキュメントでは、読者がdistutilsに精通していることを前提としており、distutilsがベースツールセットをどのように拡張するかのみをドキュメント化しています。 distutilsが方言を定義し、setuptoolsがその方言を強化すると考えることができます。

新しいプロジェクトに対する私の個人的なアプローチは、distutilsを使用するという前提から始まります。プロジェクトがsetuptoolsの機能を必要とするように成長した場合にのみ、アップグレードを行います。 setuptoolsはdistutilsのドロップイン交換であり、setup.pyを1行変更するだけです。

9
user590028

基本的には、責任分担によるものです。

setuptoolsはPython標準ライブラリの一部ではありません。これは、Pythonコアチームではなく、サードパーティによって維持されているためです。これは、とりわけ、以下を意味します。

  • コアテストスイートでカバーされておらず、コア機能に依存していません。
  • アドオンモジュール(それらの場所、インポートの方法、C拡張機能のバイナリインターフェイスなど)のコア標準を設定しませんself
  • Pythonリリースから独立して更新およびリリースされます

実質的に、コアチームはdistutilsの範囲を絞り込み、「コア標準」と「最小限必要なコンパイル」部分を確保していますそれ以上のすべてのものを残しながら(拡張コンパイラ/パッケージ形式/何でもサポート)サードパーティに。以前にそれらの「拡張部分」をカバーしていたコードは、後方互換性のために古くなったままでした。

Pythonモジュールの配布— Python 2.7.12ドキュメント

distutilsの直接使用は段階的に廃止されますが、現在のパッケージングおよび配布インフラストラクチャの基盤を構築し、標準ライブラリの一部であるだけでなく、その名前は他の方法(たとえば、 Pythonパッケージング標準の開発を調整するために使用されるメーリングリストの名前。

他のOSのパッケージも同様に、setuptoolspipを別々に提供します-前述の理由

  • また、システム上にすでに別のパッケージマネージャーが存在する場合、それらは不要である-または保守性に有害でさえあるため-。
7
ivan_pozdeev