11

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

だから私は関数ポインタを持っていて、この関数をPyMethodDef構造体を使ってモジュールのメソッドとして置き、それをに渡して、関数を簡単に取得できるPy_InitModule("module", ModMethods);を取得できることを知っています。PyObject* module

しかし、私が本当に感謝しているのは、毎回別のモジュールを再作成する必要なしに、この関数をその場で作成できることです。

私はPythonのドキュメントといくつかのPythonヘッダーを調べて、実際の成功なしにこれを行うためのハッキーな方法について考えました...しかし、これを行うためのより一般的な方法があるかどうか疑問に思います。

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

これを達成する方法について何かアイデアはありますか?

4

1 に答える 1

25

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

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ので、ソースをチェックして、思ったとおりになったことを確認します。

于 2011-07-08T15:35:06.287 に答える