4

インストール段階で python (拡張) モジュールにいくつかの機能を含める方法を探しています。

実際的な方法では:

同じ関数の2つの実装を持つPythonライブラリがあります。1つは内部(遅い)で、もう1つは外部ライブラリに依存する(高速、C)。

このライブラリはオプションであり、次のようなフラグを使用してコンパイル/インストール時にアクティブ化できることを望みます。

python setup.py install # (it doesn't include the fast library)
python setup.py --enable-fast install

Distutils を使用する必要がありますが、すべてのソリューションが受け入れられています!

4

2 に答える 2

4

distutilsのドキュメントには、標準機能の拡張に関するセクションが含まれています。distutils.command.*関連する提案は、モジュール(build_pyまたはなど)から関連するクラスをサブクラス化し、新しいバージョンを使用するようにinstall指示することです(引数を通じて、コマンドを実行するために使用されるクラスにコマンドをマッピングします)。新しいオプションを追加するために何をしなければならないかについての良いアイデアを得るには、任意のコマンドクラス(たとえば、installコマンド)のソースを参照してください。setupcmdclass

于 2010-04-25T18:24:56.250 に答える
2

まさにあなたが望むものの例はsqlalchemycextensions です。これは、同じ目的のために特に存在します-より高速なC実装です。SA がどのように実装したかを確認するには、次の 2 つのファイルを確認する必要があります。

1) setup.py。以下の抜粋からわかるように、これらは と のケースを処理しsetuptoolsますdistutils

try:
    from setuptools import setup, Extension, Feature
except ImportError:
    from distutils.core import setup, Extension
    Feature = None

後でチェックがif Feature:あり、 variable を使用してケースごとに拡張機能が適切に構成されextra、後で関数に追加されsetup()ます。

2) base.py : ここで がどのようBaseRowProxyに定義されているかを見てください:

try:
    from sqlalchemy.cresultproxy import BaseRowProxy
except ImportError:
    class BaseRowProxy(object):
        #....

したがって、基本的に C 拡張機能がインストールされると (--with-cextensionsセットアップ中にフラグを使用して)、C 実装が使用されます。それ以外の場合は、クラス/関数の純粋な Python 実装が使用されます。

于 2010-04-25T20:43:57.887 に答える