2011-01-15 16 views
7

いくつかのCライブラリ(数値計算のためのGnu Scientific Library(GSL)など)に依存するPythonパッケージをお持ちの場合は、ライブラリとコードをバンドルするのは良い考えですか?PythonアプリケーションにCライブラリをバンドルする必要がありますか?

私は自分のパッケージをできるだけ簡単にインストールしたいと思っています。私はCライブラリを手作業でダウンロードしてインクルードパスを提供する必要はありません。また、私が出荷するライブラリのバージョンが自分のコードと互換性があることをいつも確実にすることができます。

しかし、ユーザーがライブラリを既にインストールしている場合、またはこれを行わない理由が他にもある場合は、競合が発生する可能性はありますか?

私はバイナリ配布を提供するだけで簡単に利用できることを知っていますが、すべてのOSでバイナリ配布を維持する必要はありません。ですから、私はソースディストリビューションに固執したいと思いますが、(Cコンパイラを誇らしげに所有している)ユーザにとって、インストールはpython setup.py installと同じくらい簡単でなければなりません。

答えて

0

srcの2つの別々のブランチを持つことができます.1つはライブラリを含み、もう1つはそうではありません。こうすることで、ライブラリをインストールした場合にユーザーに明示的に警告することができます。別の解決策(ライブラリのライセンスが許可されている場合)は、単一のファイルにそれらをラップすることです。

私は独特の解決策はないと思いますが、これは私がこれまで考えることができる考えです。

幸運

0

あなたはあなたのアプリケーションのためのプライベートなPython環境を作成するためにvirtualenvを使用することができます。これにより、他のライブラリとの競合を避けることができます。 Distributeを使用してライブラリなどのモジュールや依存関係をパッケージ化するのが最善です。 Distutilsは、調査する価値のあるものです。

4

配布は、どのソフトウェアプロジェクトにとっても難しい部分の1つです。 Javaと.NETは、標準的なランタイムを定義し、単に「他のすべてのものを配布する」と言うことで、この負担を軽減します。もちろん、欠点があります。ランタイムでサポートされている言語ですべてを書き直す必要があります。ネイティブコードを使用するとすぐにすべての利点が失われます。

PythonではRuby、C、C++などの言語で使用されているため、通常は既存のネイティブライブラリを活用するため、難しくなります。

一般的に言えば:

  1. を、それが可能なソースsdistのを取得するようにしてください、一例としてpypi.python.org経由。 install_requiresを正しく設定してください(おそらく、GSL自体ではなく、GSLのPythonバインディングが必要になるでしょう)。標準のsetuptools/distributeレイアウトを使用してください。これにより誰もがディストリビューションのパッケージ管理者があなたのソフトウェアを拾ってパッケージ化することができます。

  2. さらに、視聴者に完全インストール可能なパッケージを提供することを検討してください。すべてのディストリビューションとオペレーティングシステムをサポートする必要はありません。最も使用されると思われるものを1つまたは2つ選んでください。 PyInstallerのようなツールを使うと、多くのオペレーティングシステム用にインストール可能な実行可能パッケージを作成できますが、特にLinuxの場合は、独自のバージョンの推移的なdeps(libgsl?)をインストールしたい場合があります。それを満足させるためのrpmパッケージ - もう一度、すべてのディストリビューションをサポートしようとしないでください、あなたは気違いになるでしょう。あなたが最もよく使うものをサポートし、他のユーザーが他のパッケージングのニーズを手伝うことを許可します。また

Python Packaging Guide

を見てみましょう
関連する問題