Капсулы - это в основном непонятные для Python указатели на пустоты, которые вы можете передавать или связывать с модулями.Они являются «способом» решения вашей проблемы.
Вот пример, в котором используется экземпляр x, который не обязательно должен быть статическим.Сначала прикрепите указатель к вашему модулю примерно так (проверка ошибок удалена) ...
// wrap the methods to be exposed to python in a module
// i.e. this is a list of method descriptions for the module
static PyMethodDef InitializeTurkeyMethods[] = {
// this block describes one method.. turkey.do_something()
{"do_something",
turkey_do_something, // fn pointer to wrap (defined below)
METH_VARARGS,
"do something .. return an int."},
{NULL, NULL, 0, NULL} // sentinel.
};
int init(X * x) {
// initialize embedded python scripting ..
// (this method a no-op on second or later calls).
Py_Initialize();
// initialize the turkey python module
PyObject * module = Py_InitModule("turkey", InitializeTurkeyMethods);
// Create a capsule containing the x pointer
PyObject * c_api_object = PyCapsule_New((void *)x, "turkey._X_C_API", NULL);
// and add it to the module
PyModule_AddObject(module, "_X_C_API", c_api_object);
}
Затем в функции, которую вы хотите выставить в python, чтобы вернуть этот указатель X, вы делаете что-то вроде этого(это на самом деле должно пройти, прежде чем вы начнете ссылаться на него в приведенном выше коде):
static PyObject* turkey_do_something(PyObject *self, PyObject *args) {
if(!PyArg_ParseTuple(args, ":turkey_do_something"))
return NULL;
// get the x pointer back from the capsule
X * x = (X*)PyCapsule_Import("turkey._X_C_API", 0);
// call some fn on x
return Py_BuildValue("i", x->some_fn_that_returns_an_int());
}
Здесь "turkey._X_C_API" - это просто имя для некоторой дополнительной проверки типов - введите здесь какое-то значимое имя дляваше приложение.Turkey - это название демо-модуля, которое я придумал.
Теперь, предположив, что, и в зависимости от того, как вы экспортировали turkey_do_something fn при вызове Py_InitModule (), вы можете вызвать это так из скрипта python:
import turkey
print turkey.do_something()
Проверьте это:http://docs.python.org/2/c-api/arg.html как отформатировать кортежи и это .. http://docs.python.org/3.1/c-api/capsule.html для документа на капсулах