配布、distutils、setuptools、distutils2の違いは?


594

状況

私はオープンソースライブラリをPython 3に移植しようとしています(誰かが疑問に思っている場合はSymPy)。

その2to3ため、Python 3のビルド時に自動的に実行する必要があります。そのためには、を使用する必要がありますdistribute。そのため、現在のシステムを移植する必要があります(doctestによると)distutils


問題

残念ながら、私はこれらのmodules-違いだかわからないんだけどdistutilsdistributesetuptools。すべてが互いにフォークされているように見え、ほとんどの状況(ただし、実際にはすべてではない)で互換性があるように意図されているため、ドキュメントなどは最も簡単です。


質問

誰かが違いを説明できますか?何を使うべきですか?最新のソリューションは何ですか?(余談ですが、への移植に関するガイドもありがたく思いDistributeますが、それは質問の範囲を少し超えています...)


22
混乱するでしょうか?私はJava / C ++のバックグラウンドからPythonに来ました。これらの状況では、配布は非常に簡単です。Pythonでは、これらすべての配布システムについて完全に混乱しています。
Raffi Khatchadourian、2011年

75
私は同意します。Pythonのパッケージ化/インストールには、コミュニティからの明確なガイダンスがないため、選択肢が多すぎます。
Sabuncu

6
バイナリディストリビューションをサポートしないpipに関するこの関連情報をリンクしたかっただけですlucumr.pocoo.org/2012/6/22/hate-hate-hate-everywhere
pixelbeat

@pixelbeat pipは、ホイールのインストール(いわゆるバイナリ配布)をサポートしていますが、そのリンクは古くなっています。
Flimm

回答:


836

2020年3月の時点で、この質問に対する他のほとんどの回答は数年古くなっています。Pythonパッケージの問題に関するアドバイスに出くわしたときは、公開日を確認することを忘れないでください。古い情報は信用しないでください。

ユーザーガイドを包装Pythonは読む価値があります。すべてのページに「最終更新日」が表示されるので、マニュアルの新しさを確認でき、非常に包括的です。それがPython Software Foundationのpython.orgのサブドメインでホストされているという事実は、それに信憑性を追加するだけです。ここでは、プロジェクトの概要ページが特に関連しています。

ツールの概要:

Pythonのパッケージングランドスケープの概要は次のとおりです。

サポートされているツール:

非推奨/廃止されたツール:

  • distributeのフォークでしたsetuptools。同じ名前空間を共有しているため、Distributeがインストールされている場合は、Distributeで配布されimport setuptoolsたパッケージを実際にインポートします。DistributeはSetuptools 0.7にマージされたため、Distributeを使用する必要はありません。実際、PypiのバージョンはSetuptoolsをインストールする互換性レイヤーにすぎません。

  • distutils2を最大限に活用する試みdistutilssetuptoolsありdistribute、Pythonの標準ライブラリに含まれる標準ツールになりました。アイデアはdistutils2古いPythonバージョンに配布distutils2されpackaging、Python 3.3に名前が変更され、標準ライブラリに含まれるようになるというものでした。これらの計画は意図したとおりに進んでいませんでしたが、現在、distutils2放棄されたプロジェクトです。最新のリリースは2012年3月で、そのPypiホームページはその死を反映するように最終的に更新されました。

その他:

他のツールもあります。興味がある場合は、Python Packaging User GuideのProject Summariesをご覧ください。私は、そのページを繰り返さないために、としただけについての質問、マッチング答えを保つために、それらをすべて表示されませんdistributedistutilssetuptoolsとしますdistutils2

勧告:

このすべては、あなたに新しいものであり、あなたが開始する場所がわからない場合、私は学習をお勧めしますsetuptoolsとともに、pipおよびvirtualenv、そのすべての作業は非常によく一緒に。

あなたに探しているならvirtualenv、あなたはこの問題に興味があるかもしれない:違いは何ですかvenvpyvenvpyenvvirtualenvvirtualenvwrapper、など?。(はい、知っています、私はあなたとうめきます。)


2
@makeramen:メーリングリストでこのスレッドを参照してください。
Flimm 2013年

6
そして、これ以上見栄えはしていません:'Distribute' is a now deprecated fork of the 'Setuptools' project.@ PyPI配布ページ。
KurzedMetal 2013年

3
SetupToolsの関係者によると、@ KurzedMetalは、setuptools 0.7が配布と古いsetuptoolsの両方をユニバースに復元することを想定しています。だから、物事はかなり改善するように設定されています!
ジョンマクドネル2013年

8
Pythonのパッケージユーザーガイドは Pythonのパッケージの状態に関する最新の情報を持っています。2013年のPyConでNick Coughlanによって指摘されました。
imanuelcostigan 2013

1
@Flimm最後の編集はかなり前のことです。お弁当はもう熟成していますか?
Martin Thoma

251

私はdistutilsのメンテナーであり、distutils2 / packagingの貢献者です。私はConFoo 2011でPythonパッケージングについて話しましたが、最近では、その拡張バージョンを作成しています。それはまだ公開されていないので、ここに物事を定義するのに役立つはずの抜粋があります。

  • Distutilsは、パッケージ化に使用される標準ツールです。単純なニーズにはかなりうまく機能しますが、制限があり、拡張するのは簡単ではありません。

  • Setuptoolsは、不足しているdistutils機能を満たし、新しい方向性を模索したいという願望から生まれたプロジェクトです。一部のサブコミュニティでは、これは事実上の標準です。これは、Pythonコア開発者が嫌うサルパッチングと魔法を使用しています。

  • Distributeは、開発ペースが遅すぎ、進化させることが不可能であると開発者が考え始めたSetuptoolsのフォークです。distutils2が同じグループによって開始されたとき、その開発はかなり遅くなりました。2013年8月の更新:配布がsetuptoolsにマージされて廃止されました。

  • Distutils2は、distutilsコードベースのフォークとして開始された新しいdistutilsライブラリで、セットアップツール(一部はPEPで徹底的に議論されたもの)から得られた優れたアイデアと、pipに触発された基本的なインストーラーです。 Distutils2のインポートに使用する実際の名前はpackaging、Python 3.3以降の標準ライブラリ、またはdistutils22.4以降および3.1〜3.2にあります。(バックポートは間もなく利用可能になります。) Distutils2はPython 3.3リリースを作成せず、保留にされました。

より詳しい情報:

すぐにガイドを完成させたいと思います。各ライブラリの長所と短所、および移行ガイドに関する詳細が含まれます。


1
いいえ。distutils2は、標準化(PEP)後かどうかに関係なく、setuptools / distributeからいくつかの優れたアイデアを取り入れています(たとえば、開発コマンドと自動スクリプト生成を追加するGSoC学生にメンターします)が、ドロップインになることはありません。交換:不要な部分があります(卵、VCS統合など)。OTOH、distutils2には、setuptools / distributeにはないものがあります。移行を容易にするために、ディストリビュート開発者はおそらくdistutils2を使用して新しい標準とツールをサポートすると思います。また、setuptools開発者が新しい標準をサポートしたいと言ったことを覚えていると思います。
エリックアラウージョ

1
ez_setupはこれらすべてのどこに該当しますか?また、distutils2のステータスの更新はありますか?
James McMahon

2
@ÉricAraujo遅れてごめんね。3.4に間に合うように準備ができていることを本当に願っています!私 Pythonが大好きですが、パッケージのおかげで頭を壁にぶつけてしまいました。(他のニュースでは、あなたのガイドはどのように来ますか?それが終わったら、上の回答にリンクしてくれませんか?)
Zearin

9
@AlexisHuetこの種類のコメントには、コメントへのリンク(shareボタンから取得できます)が含まれている場合に適しています。
erikbwork 2013年

2
おそらく、distribute最近マージされてに戻ったと回答を更新する必要がありますsetuptools。情報の多くが古くなっているという事実が混乱を
助長

5

注:回答は非推奨になり、Distributeは廃止されました。Python Packaging Authorityが設立され、これを整理するために多くの作業を行ったため、この回答は無効になりました。


はい、わかりました。:-o現在のところ、優先パッケージはDistributeであると思います。これは、distutils(元のパッケージシステム)の拡張であるsetuptoolsのフォークです。Setuptoolsはメンテナンスされていなかったため、フォークされて名前が変更されましたが、インストールされると、setuptoolsのパッケージ名が使用されます。今ではほとんどのPython開発者がDistributeを使用していると思いますが、確かにそうです。


記録のために、私はこの答えを今私に教えてくれたので、私はこの回答を受け入れました(そして、フォークは、他の回答の画像が言及していない関係の延長です)。そして、道の途中のどこかで、ドキュメント自体は通常何を言おうとしているのかよくわからないことも学びました。
VPeric

2
@VPeric、確かに、ドキュメントにはPythonのこの側面が流動的/混乱の状態にあるという事実が反映されています。
-juanchopanza

2

私はあなたの元の問題の疑いのない仮定に対処することなくあなたの二次的な質問に答えたと思います:

私はオープンソースライブラリ(SymPy、だれか不思議に思っています)をPython 3に移植しようとしています。これを行うには、Python 3用にビルドするときに2to3を自動的に実行する必要があります。

あなたはあり、ない必要。他の戦略はhttp://docs.python.org/dev/howto/pyportingで説明されています

そのためには、distributeを使用する必要があります。

あなたは可能:のを配布するさまざまな方法で、コードのビルド時の2to3は変換(ないドキュメンテーション文字列)のdistutilsがサポートする:) http://docs.python.org/dev/howto/pyporting#during-installation


おかげで、変換を処理するスクリプトを作成して問題を解決することを既に決定しました。ええ、私は2to3を使用する以外のオプションがあることを知っていましたが、SymPyは複雑なコードベース(前回チェックしたときは約200k +行)であり、2to3を使用することが唯一の現実的な戦略でした。とにかくありがとうございました!
VPeric 2011

2

幸運なことに、Pythonのパッケージングの混乱がContinuumの「conda」パッケージマネージャーによって大幅にクリーンアップされた2014年後半にこの質問を更新しました。

特に、condaはすぐにcondaの「環境」の作成を可能にします。さまざまなバージョンのPythonを使用して環境を構成できます。例えば:

conda create -n py34 python=3.4 anaconda

conda create -n py26 python=2.6 anaconda

Pythonのバージョンが異なる2つの(「py34」または「py26」)Python環境を作成します。

その後、Pythonの特定のバージョンで環境を呼び出すことができます。

source activate <env name>

この機能は、異なるバージョンのPythonを処理する必要がある場合に特に役立ちます。

さらに、condaには次の機能があります。

  • Pythonに依存しない
  • クロスプラットフォーム
  • 管理者権限は不要
  • スマートな依存関係管理(SATソルバーによる)
  • リンクしなければならない可能性のあるC、Fortran、およびシステムレベルのライブラリをうまく扱います。

この最後の点は、科学計算分野にいる場合は特に重要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.