7

Pythonでラップする必要がある、設計が不十分で大きな(ヘッダーファイル> 300 public functions>200 numeric constants定義されている)があります。#defineと ファイルがdllありhます。ライブラリは毎年更新され、現在まで下位互換性があります (つまり、関数が追加され、定数が数値を保持するなど)。ただし、ライブラリを制御していないため、保証はありません。

を使用するctypesと、これを Python でラップする 2 つの方法がわかります。

  1. すべての定数と関数を 1 対 1 で Python にマッピングする
  2. Python で API を再定義し、ライブラリを呼び出します。

1 つ目は、ヘッダー ファイルから (ほぼ) 自動で実行できるため、保守とアップグレードが簡単です。2 つ目は、多くの Python コードが必要ですが、使いやすいでしょう。

この種の問題に関するあなたの経験といくつかの例に基づいて、いくつかの意見をいただければ幸いです。

4

2 に答える 2

4

最近、ctypesgenを使用して、SDLおよび補完ライブラリ(SDL_image、SDL_ttf、SDL_mixer)のctypesラッピングを作成しました。

私にとって、それはかなりうまくいきました。Python 2.xを生成しますが、「2to3」ユーティリティを使用して目的の3.xコードを取得することができました。

より「pythonic」なAPIの基盤としてctypesラッピングを使用することは良い考えだと思います。それは基本的に、pslabモジュールで(非常に単純なレベルで)行ったことです。

したがって、同様のことを行う場合は、それが1つの方法になります。

于 2012-10-08T12:48:52.477 に答える
0

ctypes バックエンドで Python ライブラリを維持することは、管理不可能なアプローチではありません。明らかに初期投資は自動化ツールを使用するよりも大きくなりますが、残っている API ははるかに優れているはずです。

その方法を取る場合は、Python API を C ライブラリから完全に分離することを目指してください。1 つの Python フロント エンド API で複数の ctypes バックエンドをサポートすることはそれほど悪くありません。実行時にクエリを実行し、正しい ctypes ラッパー モジュールを動的にロードするだけです。Windows と Linux のさまざまな dll ファイルと .so ファイルをラップするためにそれを行いましたが、ライブラリのバージョンでも機能します。

于 2012-10-21T10:12:20.633 に答える