setuptoolsとdistutils:なぜdistutilsがまだ残っているのですか?


142

これらが含まれます:Pythonは、プロジェクトをパッケージ化して記述するために使用できるツールの混乱の歴史を持ちdistutils、標準ライブラリではdistributedistutils2setuptools(そしておそらくそれ以上)。と思われdistributedistutils2廃止されたため、setuptools2つの競合する標準が残っています。

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

Pythonのパッケージングユーザガイド [ 1 ]今お勧めします。

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

そして説明します:

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

を使用することを選択したプロジェクトであっても、distutilspipがそのようなプロジェクトを(事前に作成されたwheelファイルからインストールするのではなく)ソースから直接インストールする場合、setuptools代わりに使用してプロジェクトをビルドします。

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

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

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

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


4
distutilsはに統合setuptoolsされましたが、使用するように作成されたレガシーアプリがありdistutils、正しい標準に移行するためにコストがかかります。
メタトースター2014

3
「distributeとdistutils2が廃止され、setuptoolsが採用されたようです」、正しい、distributeは現在setuptoolsのラッパーにすぎず、distutils2は死んでいます。
-SEは邪悪である

1
setuptoolsは拡張された代替手段ですが、distutilsスクリプト自体がインポートするだけの場合でも、推奨されるpipインストーラーはですべてのsetup.pyスクリプトを実行しますsetuptoolsdistutils」(ソース
user2314737

回答:


77

このSOの質問を見てください。それはすべてのパッケージング方法を非常によく説明し、あなたの質問にある程度答えるのに役立つかもしれません:配布、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パッケージをサルパッチすることです。それはピップでうまくいくはずです。2013年7月に最新版がリリースされました。

ご覧のとおり、setuputilsはdistutilsよりも優先されるべきであり、私はあなたの質問がどこから来たのかを理解していますが、簡単に言うと、人気のあるレガシープログラムで多くの場合に使用されているため、distutilsがサポートを失うことはありません。そして、おそらくご存じのとおり、レガシープログラムでこれらの種類の変更を行うことは非常に面倒であり、たとえば非互換性などのかなりの数の問題が発生する可能性があるため、開発者はソースコードを書き直す必要があります。つまり、それがあり、またdistutilsは標準のpythonライブラリの一部ですが、setuptoolsはそうではないという事実もあります。したがって、Pythonプログラムを作成する場合は、この時代にはsetuptoolsを使用してください。ただし、distutilsがなければ、setuptoolsは存在しなかったことに注意してください。


3
「Distutilsは今でもPythonでパッケージ化するための標準ツールです。」Python Packaging User Guideと矛盾します。
2014

1
私はそうは思いませんが、setuptoolsが標準であると明示的に言っていますか?また、そのフレーズは私が提供したウェブサイトから引用されたものであり、私の言葉ではないことに注意してください。しかしそれは私、他の多くの人々の間で同意する意見です。

コミュニティがあなたに同意しているようですので、賞金を授与しました。残念ながら、この質問は私が望んでいたほどには注目されませんでした。
2014

easy_installは、私がsetuptoolsを拒否した主な理由です-これは、それを使用するパッケージ(再パッケージするだけの方が簡単)で私にとって大きな問題の原因となってきました。その他の機能は問題ありません。
スチュアートガスマン

14

setuptoolsが標準ライブラリにない唯一の理由です

それが理由の1つです。以下はNumPysetup.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れていました。コミットログの引用:

Setuptools sets mode +x on the test scripts, so that Nose refuses to run
them. Better not do that.

もちろん、合併の間setuptoolsとは、distribute期限内にこのすべてを解決する必要がありますが、多くのパッケージはまだPythonの2.6のインストールをサポートする必要があります。


1
distributeのフォークでsetuptoolsあり、現在はマージされています。
R4444

10

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

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

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

新しいプロジェクトに対する私の個人的なアプローチは、distutilsを使用することを前提としています。プロジェクトがsetuptoolsの機能を必要とするようになったときにのみ、アップグレードを行います。setuptoolsはdistutilsの代替品であり、私のsetup.pyに対する1行の変更です。


ご回答有難うございます。setuptoolsのインストールはブートストラップできるため、可用性の引数はそれほど重要ではないと思います。distutilsが十分な機能性を提供する場合、それを使用することには意味があると思います。しかし、私の考えではdistutilsとsetuptoolsを混在させることは、自分の目標を達成するための非常にクリーンな方法ではありません。しかし、@ larsmansは彼の回答で、一部のタスクにdistutilsを使用することを強制するsetuptoolsのいくつかの困難を示しました。
2014

9

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

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

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

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

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

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

他のOSのパッケージも同様にsetuptoolspip個別に提供する可能性があります-前述の理由により

  • また、システム上にすでに別のパッケージマネージャーが存在する場合、それらは必要ではないため、または保守性にとっても有害です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.