7

私はPythonモジュールを作成しましたが、純粋なPython実装とC拡張機能の2つのバージョンがあります。__init__.pyC拡張機能をインポートしようとするようにファイルを作成しましたが、失敗した場合は、純粋なPythonコードをインポートします(これは妥当ですか?)。

ここで、このモジュールを配布するための最良の方法(たとえば、write)を知りたいsetup.pyので、C拡張機能を構築または使用する機能の有無にかかわらず、次のコマンドを実行するだけで簡単に使用できます。

python setup.py install

私の経験は限られていますが、2つの可能性のあるケースがあります。

  • ユーザーは、C拡張機能をビルドするためのMSVisualStudioまたはGCCコンパイラスイートをマシンにインストールしていません。
  • ユーザーはIronPython、Jython、またはCPython以外のものを実行しています。私はCPythonのみを使用しました。そのため、C拡張機能を使用できない場合に、これらのプラットフォームでスムーズに動作し、簡単にインストールできるように、このモジュールをどのように配布できるかわかりません。
4

3 に答える 3

7

(それは合理的ですか?)

うん、完全に賢明だ。

「適切なCコンパイラがない場合」をキャッチするには:setup(...)問題が発生した場合、を呼び出すとsys.exitが実行されます。したがって、最初に、 :ext_modules内で、必要に応じて引数を設定して試してください。try

try:
  setup(..., ext_modules=...)
except SystemExit: ...

そして、exceptその節で、(拡張機能の構築とインストールをあきらめる)なしsetup(...)で再度呼び出します。インストールしているユーザーには、「gcc-4.0を実行できません:そのようなファイルまたはディレクトリはありません」などのメッセージが表示されますが、独自のメッセージを適切に追加して、大したことではなく、拡張モジュール。ext_modules

非CPython実装をサポートするために、setup.pyテストすることができます(たとえば、sys.version非CPython実装ごとに値がどうなるかはわかりませんが、IronPythonにはサブストリングがあります) 。チェックでそのような実装を見逃した場合、try / exceptionは、適度な量の無駄な作業で、とにかく他のほとんどをキャッチするはずです;-)。'IronPython'ext_modules

于 2010-03-08T01:19:33.747 に答える
0

「C拡張機能をインポートしようとしますが、失敗した場合は、純粋なPythonコードをインポートします(それは妥当ですか?)。」

ほとんど。について読んcStringIOでくださいStringIOcPickleとについても読んでくださいPicklecElementTreeとについても読んでくださいElementTree

Cバージョンをビルドできない場合は、それが1つのユースケースです。純粋なPythonバージョンのみが利用可能です。

ただし、Cバージョンを作成できれば、それを拒否する十分な理由があります。主に、アプリケーションに必要なサブクラスの深さが許可されない可能性があるため、Cバージョンを拒否することを検討します。

たまたま正しいコンパイラを持っていたからといって、Cバージョンを強制的に使用したくありません。私は自分でそれらの決定をすることを好みます。

したがって、モジュールの一部がアーキテクチャを決定するという考えは好きではありません。どちらをインポートするかを選択することを好みます。Cバージョンが存在しない場合でも、純粋なPythonバージョンのサブクラスを作成している可能性があるため、決定プロセスは変更されません。

結論。自動化を減らします。2つのモジュールを提供します。どちらをインポートするかを選択することを好みます。

于 2010-03-08T03:41:31.570 に答える
0

Planarのドキュメントによるとsetup.py、C拡張機能をビルドするためのファイルを通常どおりに作成し、次のようにすることができます。

ソースディストリビューションまたはリポジトリからPlanarをビルドしてインストールするには、次を使用します。

python setup.py install

コンパイルせずに純粋なPythonモジュールのみをインストールするには、次を使用します。

python setup.py build_py install --skip-build
于 2010-04-27T14:07:00.083 に答える