2014-10-20 53 views
4

我的应用程序嵌入python。该应用程序通过添加它自己的功能延伸到嵌入式Python:Python:从C函数中确定模块名称

PyObject *ReadDPoint(PyObject *self, PyObject *args) 

然后,应用程序运行不同Python脚本,其调用ReadDPoint扩展功能(模块)。 该任务是确定被调用的ReadDPoint函数内的模块名称,该函数被调用的模块的名称。 我预计该解决方案就像是其中之一:

PyObject *module_name = PyObject_GetAttrString(self, "__name__") 

char *module_name = PyModule_GetName(self) 

但我有一个很大的惊喜已经发现,在扩展功能ReadDpoint自内等于NULL,并参考它导致崩溃。 有没有一种方法来确定C函数内的模块名称? 谢谢!

+0

无代码的添加功能的模块。 – 2014-10-20 02:50:37

+0

看看[调用者范围如何在纯Python中访问](http://stackoverflow.com/q/13312240/4279)。 – jfs 2014-10-20 03:37:25

+0

Python中的函数属于它们定义的模块,而不是调用。如果您可以从Python代码中调用它,您的扩展模块必须已经注册。 'self'指向方法的对象,即[除非它是一种绑定方法;它是NULL](http://stackoverflow.com/questions/53225/how-do-you-check-whether-a-python-method-is-bound-or-not) – jfs 2014-10-20 03:40:45

回答

0

我已经找到一种方法来确定从哪个扩展C函数被调用的模块名称:

PyFrameObject *pyframe; 
PyObject *pydict; 
pyframe = PyEval_GetFrame(); 
pydict = pyframe->f_globals; 
PyObject *pyname; 
pyname = PyDict_GetItemString(pydict, "__name__"); 
wxMessageBox(PyString_AsString(pyname)); 

现在pyname持有seeked MODULENAME