Python:从 C 函数中确定模块名称

Posted

技术标签:

【中文标题】Python:从 C 函数中确定模块名称【英文标题】:Python: determining module name from within C function 【发布时间】:2014-12-14 23:20:18 【问题描述】:

我的应用程序嵌入了 python。该应用程序通过添加它自己的函数来扩展嵌入式 python:

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

然后应用程序运行调用 ReadDPoint 扩展函数的不同 python 脚本(模块)。 任务是确定调用的 ReadDPoint 函数内的模块名称,调用该函数的模块的名称。 我希望解决方案类似于以下之一:

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

char *module_name = PyModule_GetName(self) 

但我惊讶地发现,在扩展函数 ReadDpoint 内部,self 等于 NULL,并且引用它会导致崩溃。 有没有办法确定 C 函数中的模块名称? 谢谢!

【问题讨论】:

这些代码都没有将函数添加到模块中。 看how the caller scope could be access in pure Python。 Python 中的函数属于它们定义的模块,而不是被调用的模块。如果您能够从 Python 代码中调用它,您的扩展模块必须已经注册了它。 self 指向方法的对象,即unless it is a bound method; it is NULL 【参考方案1】:

我找到了一种方法来确定调用扩展 C 函数的模块名称:

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

现在 pyname 保存了寻找的模块名

【讨论】:

以上是关于Python:从 C 函数中确定模块名称的主要内容,如果未能解决你的问题,请参考以下文章

python里使用reload函数

Python-3

Python - 从导入的模块注册函数

确定一个函数在 Python 模块中是不是可用

Python C 模块函数参数引用计数

匿名函数内置函数与模块