Расширение Python на C ++: как определить имя функции Python при обратном вызове C

У меня есть расширение Python на C ++ с Python API.
Существует один обработчик функции c для разных функций python.
Как в обработчике функции C я могу определить функцию Python, который вызвал меня?
Аргумент обработчика PyObject * self равен нулю …

У меня есть таблица методов

<...>
PyObject* pyCallBackFunction(PyObject* self, PyObject* args, PyObject* kw){
// how i can determine here what python function called me?
// self = 0x00 on callback...
}
<...>
std::vector<char*> pyFuncs;
pyFuncs.push_back("Main");
pyFuncs.push_back("testMethod");
pyFuncs.push_back("func3");
this->PyMethodDefTable = (PyMethodDef*) malloc(sizeof(PyMethodDef)*(pyFuncs.size()+1));
for (unsigned int i=0; i<pyFuncs.size();++i){
this->PyMethodDefTable[i] = (PyMethodDef) {pyFuncs[i],pyCallBackFunction,METH_KEYWORDS,pyFuncs[i]};}
PyMethodDef nullDef = (PyMethodDef){NULL, NULL, 0, NULL};
this->PyMethodDefTable[pyFuncs.size()] = nullDef ;
<...>
PyObject *m = Py_InitModule("testModule", this->methodsTable);

Вызов Python:

import testModule
def Main():
res1 = testModule.testMethod(arg1="test string", arg2= 34)
res2 = testModule.func3(arg1="test string2", arg2= 434)
return 1

Спасибо за вашу помощь!

1

Решение

Ты можешь позвонить PyEval_GetFrame() который дает вам указатель на текущий объект кадра PyFrameObject Этот объект имеет член с именем f_code который является PyCodeObject и этот объект кода имеет член под названием co_name который является PyObject которая на самом деле является строкой, из которой вы можете извлечь имя функции, в которой вы находитесь.

Из самого питона это можно получить с помощью sys._getframe(0).f_code.co_name

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector