5

多くのソースファイルとヘッダーファイルで構成されるCライブラリを作成したので、Pythonレイヤーでラップして、「インポート」できるようにする必要があります。

Pythonから呼び出される静的メソッドを実装しました。モジュールがインタープリターに公開するメソッドを指定する必要があります。

ただし、非静的メソッドはメソッドを登録するinitのみである必要があるため、ドキュメントでは、呼び出すことができるものを指定する際に単一のソースファイルを持つという非常に単純なケースのみを扱っているようです。

Cで静的に宣言されている場合、他のソースファイルのメソッドを呼び出すことは不可能であると私が知る限り(間違っている場合は修正してください)、Pythonモジュールごとに1つのCファイルしか持てません。全体で許可されている非静的メソッドは1つだけです。

これは本当に本当ですか?Pythonからコードにアクセスしたい場合は、コードを正しく構造化する必要がありますか?

編集:

だから、私がこれを最終的に機能させる方法は、Cythonを使用することでした。c / pythonインターフェース(以前はすべての参照カウントルールなどのために約1日かかっていました)を書き直すのに約1時間かかっただけでなく、すべてのビルドの問題を処理し、正確にどれを説明する明確なドキュメントがありますメソッドはPythonから利用できるようになります。

特に、私が使用したドキュメントの章は、ビルド手順Cライブラリの呼び出し方法言語の基本、および型、特にポインタのキャスト方法でした。

既存の複雑な構造のCコード(つまり、単一のファイル以外のもの)をPythonライブラリとしてラップしたい人には、Cythonを強くお勧めします。

4

3 に答える 3

3

モジュール初期化関数がモジュール内の唯一の非静的シンボルである必要はありません。これは、Cがランタイムシンボルに使用するフラットな名前空間の汚染を防ぐためのベストプラクティスです。これに対する他の一般的なアプローチは、エクスポートされたすべてのシンボルにライブラリ固有のプレフィックスを配置することです。静的のみのアプローチは一般的にクリーンで堅牢であると考えられていますが、どちらでも実行できます。

于 2011-02-15T18:55:13.483 に答える
2

ヘッダー ファイルを使用して、コンパイラが外部関数にアクセスできるようにします。これは Python 関連の問題ではなく、C の共通言語の側面です。

my_prototypes.h :

  // declare the prototype. everybody who includes `my_prototypes.h` now knows that it exists.
  PyObject *func_from_other_module(PyObject *self, PyObject *args);

anotherunit.c :

  PyObject *func_from_other_module(PyObject *self, PyObject *args) {
    // actual implementation
  }

mainunit.c :

  #include "my_prototypes.h"

  static PyMethodDef SpamMethods[] = {

    {"func_from_other_module",  func_from_other_module, METH_VARARGS,
      "Blabla"},
    ...
   {NULL, NULL, 0, NULL}        /* Sentinel */
  }

関数が宣言されている場合、関数がstatic含まれているファイルからのみ使用できます。これは必要ありません-staticアウトのままにしてください(基本的に、ヘッダーさえ必要ありません:関数の配置作品の上部にも宣言がありmainunit.cます)。

于 2011-02-15T18:48:35.743 に答える