web-dev-qa-db-ja.com

Pythonモジュールに依存するPythonソフトウェアを簡単に配布する方法は? UnixでのPythonパッケージのインストールに対する不満

私の目標は、広く使用されている他のいくつかのPythonパッケージを依存関係として持つPythonパッケージを配布することです。私のパッケージは、pandas、scipy、numpyなどのよく書かれたPypiインデックス付きパッケージに依存しており、setup.pyでこれらの特定のバージョン以上が必要であることを指定します。 「numpy> = 1.5」。

PythonパッケージのエキスパートであるnotであるUnixに精通したユーザーにとって、それは非常にイライラし、ほとんど不可能であることを発見しましたPython)私のようなパッケージをインストールします。これは、パッケージマネージャーの使いやすさが想定されているものを使用する場合でも同様です。誰かが提供できるこの痛みを伴うプロセスに代わるものがあるのか​​、または私の経験がPythonのパッケージ化と配布の非常に困難な現状を反映しているのだろうかと思っています。

ユーザーがパッケージをシステムにダウンロードするとします。ほとんどは、次のようなものを使用して、「単純に」インストールしようとします。

$ python setup.py install

Pythonパッケージのインストールに関するGoogleの手順を実行すると、通常、これが表示されます。ほとんどのユーザーはUnix/Linuxサーバーにrootアクセス権がないため、これは大多数のユーザーにとって失敗します。さらに検索すると、「-prefix」オプションが見つかり、次のことを試します。

$ python setup.py install --prefix=/some/local/dir

ユーザーはPythonパッケージの複雑さを認識していないため、--prefixの引数として任意のディレクトリを選択します。 "~/software/mypackage/"。ほとんどのユーザーはこれらの詳細に気づいていないため、他のすべてのPythonパッケージが存在するきれいにキュレートされたディレクトリにはなりません。彼らが別のパッケージ「myotherpackage」をインストールする場合、彼らはそれを"~/software/myotherpackage"に渡す可能性があり、これがPYTHONPATHのハッキングやその他の複雑化にどれほど苛立たせるかを想像できます。

インストールプロセスを続行すると、パッケージが正しくインストールされているように見えても、ユーザーがパッケージを使用しようとすると、依存関係の1つが欠落している可能性があるため、"setup.py install"への"--prefix"の呼び出しも失敗します(たとえば、pandas、scipy、numpyなど)とパッケージマネージャーは使用されません。彼らはこれらのパッケージを個別にインストールしようとします。成功した場合でも、"--prefix"に与えられた非標準のディレクトリが原因で、パッケージは必然的にPYTHONPATHに含まれなくなり、忍耐強いユーザーはPYTHONPATHを変更して手を出し、表示される依存関係。

この段階で、Pythonに詳しい友人から、メインストリームマネージャーである"easy_install"のようなパッケージマネージャーを使用してソフトウェアをインストールし、依存関係を処理するように指示される場合があります。難しいかもしれない"easy_install"をインストールした後、次のことを試みます:

$ easy_install setup.py 

これもまた失敗します。ユーザーは通常、実動のUnixサーバーにグローバルにソフトウェアをインストールする権限を持たないためです。さらに読むと、彼らは"--user"オプションについて学び、次のことを試します。

$ easy_install setup.py --user 

彼らはエラーを受け取ります:

usage: easy_install [options] requirement_or_url ...
   or: easy_install --help

error: option --user not recognized

easy_install--userオプションがない理由は非常に困惑しますが、オプションを説明するページがオンラインで明確に表示されています。 easy_installを最新バージョンにアップグレードしようとしても、まだ失敗する場合があります。

彼らが続けてPythonパッケージエキスパートに相談すると、混乱を最大にするために、easy_installの-​​2つのバージョンがあり、どちらも "easy_install"という名前であることがわかります。ただし、「配布」の一部と「setuptools」の別の部分です。"easy_install""distribute"のみが"--user"をサポートしており、大多数のサーバー/システム管理者がインストールしています"setuptools"easy_installなので、ローカルインストールはできません。これらの"distribute""setuptools"の違いは、専門家でない人にとっては意味がなく、理解しにくいことに注意してくださいPythonパッケージ管理。

この時点で、私のソフトウェアパッケージをインストールしようとする最も決定的で知識豊富で忍耐強いユーザーでさえ、90%を失っていたでしょう。彼らはたまたま最新のPythonパッケージ配布の専門家にならないように、たまたまPythonで書かれたソフトウェアをインストールしたかったのですが、これは非常に複雑で複雑です。彼らはあきらめ、時間の無駄にイライラします。

Pythonの専門家に続けて質問する少数のユーザーは、pip/virtualenvではなくeasy_installを使用するべきだと言われます。 pipvirtualenvをインストールし、これらのツールがどのように機能し、従来の"python setup.py"または"easy_install"呼び出しとどのように異なるかを理解することは、それ自体時間がかかり困難です。繰り返しますが、単純なPythonソフトウェアをインストールして使用したいと考えているユーザーからは、あまりにも多くの質問があります。このパスを追求する人でさえ、easy_installまたはsetup.py install --prefixを使用してインストールした依存関係がpip/virtualenvで引き続き使用可能かどうか、またはすべてを最初から再インストールする必要があるかどうかについて混乱します。

この問題は、問題のパッケージの1つ以上がデフォルトのバージョンとは異なるバージョンのPythonのインストールに依存している場合に悪化します。 Pythonパッケージマネージャーが目的のPythonバージョンを使用していること、および必要な依存関係がPython 2.xディレクトリにインストールされ、Python 2.yは、ユーザーに際限なく欲求不満を抱き、その段階では確かにあきらめるでしょう。

ユーザーがPythonパッケージ、パス、場所のこれらの技術的な詳細すべてを詳しく調べる必要がないPythonソフトウェアをインストールする簡単な方法はありますか?たとえば、私は大規模なJavaユーザーではありませんが、いくつかのJavaツールを時々使用しており、JavaソフトウェアのXとYの依存関係について心配する必要がないことを覚えていません。インストールしていましたが、Javaパッケージ管理がどのように機能するのかわかりません(そして、私がそうしなかったことをうれしく思います-たまたまJavaで書かれたツールを使いたかっただけです)。 Jarをダウンロードした場合、Jarを取得するだけで機能します。

Pythonに相当するものはありますか?これらの依存関係とバージョンをすべて追跡する必要があるユーザーに依存しない方法でソフトウェアを配布する方法は?関連するすべてのパッケージを、ダウンロードしてバイナリとして使用できる自己完結型にコンパイルする方法はありますか?

このフラストレーションは、精通したUnixユーザーにパッケージを配布するという狭い目的でも発生することを強調しておきます。これにより、クロスプラットフォームの問題などを心配せずに問題を単純化できます。ユーザーはUnixに精通していると思います。 Pythonを知っているが、Pythonパッケージの内部と外部、およびさまざまなパッケージマネージャーの無数の内部の複雑さ/競合について認識していない(そして認識されることを望まない)。この問題の厄介な機能は、Pythonパッケージのすべての依存関係が、Pandas、Scipy、Numpyなどのよく知られ、よく記述され、よく管理されているPypiで利用可能なパッケージであっても発生することです。適切に形成されたパッケージではないあいまいな依存関係に依存しているようではありません。むしろ、多くのユーザーが依存する可能性のある最も主流のパッケージを使用していました。

これに関するヘルプやアドバイスは大歓迎です。 Pythonは優れたライブラリを備えた優れた言語だと思いますが、ローカルにインストールして実行するだけの簡単な方法で、(依存関係があると)書いたソフトウェアを配布することは事実上不可能だと思います。私が書いているソフトウェアは、プログラムで使用するためのPythonライブラリではなく、ユーザーが個々のプログラムとして実行する実行可能スクリプトを持つソフトウェアであることを明確にしたいと思います。ありがとう。

58
yyk

Numpy、scipy、その他のPyPIパッケージに依存するソフトウェアプロジェクトも開発しています。現状では、リモートインストールを管理するために現在入手可能な最良のツールは zc.buildout です。 とても使いやすいです。あなたは彼らのウェブサイトからブートストラップスクリプトをダウンロードし、それをパッケージと一緒に配布します。通常はbuildout.cfgと呼ばれる「ローカルデプロイメント」ファイルを記述して、パッケージをローカルにインストールする方法を説明します。 bootstrap.pyファイルとbuildout.cfgの両方をパッケージと一緒に発送します。pythonパッケージのMANIFEST.inファイルを使用して、これら2つのファイルを強制的に埋め込みますPyPIによって配布されたZipまたはtarボールを使用します。ユーザーがパッケージを解凍すると、次の2つのコマンドが実行されます。

$ python bootstrap.py # this will download zc.buildout and setuptools
$ ./bin/buildout # this will build and **locally** install your package + deps

パッケージがコンパイルされ、すべての依存関係がインストールされますlocally。これは、パッケージをインストールするユーザーがroot権限さえ必要としないことを意味します。これは追加機能です。 。スクリプトは(通常)./binの下に配置されるため、ユーザーはその後でそれらを実行できます。 zc.buildoutはPyPIとのやり取りにsetuptoolsを使用するため、期待どおりにすべてがそのまま機能します。

zc.buildoutを拡張するのに十分ではない場合でも、簡単に拡張できます。いわゆる「レシピ」を作成して、ユーザーが追加の構成ファイルを作成したり、ネットから他のものをダウンロードしたり、カスタムプログラムをインスタンス化したりできます。 zc.buildout ウェブサイトには、ビルドアウトの使用方法と拡張方法を詳細に説明するビデオチュートリアルが含まれています。私たちのプロジェクト Bob は、科学的な使用のためにパッケージを配布するためにbuildoutを広範囲に使用しています。必要に応じて、 次のページにアクセスしてください 開発者がpythonパッケージをセットアップして他の人がローカルでビルドしてインストールできるようにする方法)の詳細な説明が含まれていますzc.buildoutを使用します。

13
André Anjos

現在、ユーザーがプラットフォームに依存しない方法でPythonソフトウェアをインストールしやすくするために、特に https:// python-packaging-user-guideを参照してください。 .readthedocs.org/en/latest/future.html および http://www.python.org/dev/peps/pep-0453/

現在、easy_installの2つの競合するバージョンの問題は解決されており、競合するフォークの「配布」がsetuptoolsの開発のメインラインにマージされています。

クロスプラットフォームの配布とPythonソフトウェアのインストールに関する現在利用可能な最良のアドバイスはここにキャプチャされます: https://packaging.python.org/

6
ncoghlan