2011-07-08 3 views
10

私はPythonを私が作成しているC++ライブラリに埋め込みます。私は、ユーザが関数ポインタPyObject* (fpFunc*)(PyObject*,PyObject*);の形でCの関数を渡すことができるようにしたいので、それらの関数を埋め込みPythonで使うことができます。C関数からPyObject *をビルドしますか?

だから私は、関数ポインタを持っていると私はPyMethodDef構造体を使用し、Py_InitModule("module", ModMethods);に渡すので、私は簡単に機能をつかむことができPyObject* moduleを取得するモジュールの方法として、この機能を置くことが可能であることを知っています。

しかし、私が本当に感謝しているのは、毎回必ず別のモジュールを再作成することなく、この機能をオンザフライで作成できることです。

私はPythonのドキュメントとPythonヘッダーのいくつかを見てきましたが、これは実際の成功なしにこれを行うためのハッピーな方法について考えています...しかし、これを行うもっと一般的な方法があるのだろうかと思います。

私が理解したところでは、すべての関数はモジュールに属していても、__builtin__なので、モジュールには少なくとも必要です。

どのようにこれを達成するためのアイデアですか?

+0

あなたが意味することは私には分かりません。なぜ関数ポインタを使用していますか?誰がそれを設定していますか? –

+0

私はPythonを埋め込んだC++ライブラリを作っています。私は関数ポインタを使用しています。なぜなら、渡すのが便利だからです。 (私の記事を編集しました) – Manux

答えて

22

見つけました。それはドキュメントにはなく、ソースにはほとんど明示されていませんが。

PyObject* (*fpFunc)(PyObject*,PyObject*) = someFunction; 
PyMethodDef methd = {"methd",fpFunc,METH_VARARGS,"A new function"}; 
PyObject* name = PyString_FromString(methd.ml_name); 
PyObject* pyfoo = PyCFunction_NewEx(&methd,NULL,name); 
Py_DECREF(name); 

これは機能します。通常はPython関数オブジェクトを呼び出すような関数を呼び出すことができます。

私が文書で見つけたのはPy_InitModule4であり、モジュールをロードしていたので、私はPythonのソースを調べて、PyCFunctionを見つけましたが、私は文書を見回しましたが見つかりませんでした何でもPyCFunction_NewExについて、私は考えたようにソースをチェックしなければなりませんでした。

関連する問題