6

サードパーティのライブラリと通信する、C で記述された複数の拡張モジュールを含む Python プロジェクトがあります。ただし、ユーザーの環境とオプションによっては、一部のモジュールをビルドしてはならず、一部のコンパイラ フラグを有効/無効にする必要があります。問題は、setup() を呼び出す前に拡張モジュールのリストを作成する必要があることです。理想的には、distutils.Command サブクラスを使用してユーザー オプションを処理したいと考えています。現在、いくつかのオプションがあります。

  1. モジュールをビルドする前に「python setup.py configure」コマンドを実行する必要があり、情報を pickle ファイルに保存し、次にスクリプトを実行するときに拡張リストを生成するために使用します。これは、私のプロジェクトが現在どのように機能しているか、非常にばかげているようです。

  2. オプションを sys.argv から手動でスクレイピングし、それらを使用してリストを作成します。最終的にはビルド前にいくつかのスクリプトを実行して設定を確認する必要があるため、これは長期的な解決策ではありません。

  3. distutils から build_ext をサブクラス化し、run() メソッドの最初で構成を行い ((2) 経由で送信されたオプションも使用する可能性があります)、ビルドする前に self.distribution.ext_modules を直接変更します。ただし、 setup() が呼び出されたときに拡張モジュールのリストが修正されていると想定する可能性があるため、これにより setuptools が混乱する可能性があります。また、build_ext 以外のコマンドで setup() が呼び出された場合、拡張モジュールのリストが空であることも意味します。

これを行うための好ましい方法はありますか?

4

4 に答える 4

1

これを行うための好ましい方法はありますか?

他の人のモジュールを扱った私の経験から、これを行う正しい方法についてのコンセンサスは確かにないと言えます。

私は distutils のサブクラス化を試みて拒否しました -- 異なる Python バージョンや異なるシステムで動作させるのは脆弱で困難であることがわかりました。

私たちのコードでは、あなたが検討しているタイプのものを試した後、setup.py のメイン コールの前に検出と構成を行うことにしました setup()。これは確かに少し醜いですが、あなたのものをコンパイルしようとしている誰かが、たとえばなぜインクルードパスが間違っているのかを理解する場所があることを意味します. (もちろん、distutils 内部の専門家である必要はありません)。

于 2010-03-04T03:13:44.753 に答える
0

私はそれをサブクラスdistutils.core.Distribution化して渡しdistutils.core.setup(distclass=CustomDistribution)ます-これにより、通常のセットアップと同じ方法でコマンドラインパラメーターにアクセスでき、メソッドの拡張機能リストを調整するなどのことができますCustomDistribution.__init__。しかし、私はdalkeに同意します、distutilsの方法は苦痛に満ちています...

于 2009-12-21T14:17:46.103 に答える
0

config コマンドは、サブクラス化され、あなたのような要件を持つプロジェクトで使用されるように設計されています。

于 2011-07-30T13:20:41.650 に答える
0

distutils の変更に関する私自身の経験は弱く不安定なものだったので、私が提供できるのはポインタだけです。numpy を見てください。これには、distutils を操作する (または回避する) 方法を備えたサブモジュール全体 (numpy.distutils) があります。それ以外の場合は、distutils メーリング リストに問い合わせてください。

于 2009-12-19T04:32:46.390 に答える