У меня есть расширение 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
Спасибо за вашу помощь!
Ты можешь позвонить PyEval_GetFrame()
который дает вам указатель на текущий объект кадра PyFrameObject
Этот объект имеет член с именем f_code
который является PyCodeObject
и этот объект кода имеет член под названием co_name
который является PyObject
которая на самом деле является строкой, из которой вы можете извлечь имя функции, в которой вы находитесь.
Из самого питона это можно получить с помощью sys._getframe(0).f_code.co_name
Других решений пока нет …