调用C函数。是谁打来的

时间:2013-06-05 06:56:54

标签: python

当python使用

调用C函数时
static PyObject* Myfunction (PyObject *self, PyObject *args)

有没有办法知道调用者是谁,即功能和模块?这将允许我有一个可以调度大量方法的方法。我想过一个黑客,比如在调用中传递字符串名称后跟参数,例如

call ("math", "sin", 2.5)

但这并不理想。

1 个答案:

答案 0 :(得分:3)

您无法直接获取模块+函数,但您可以获取任何Python(已解释)堆栈帧的文件名和函数名。

该函数返回一个带有调用者文件名和函数名的元组 使用C API:

#include <frameobject.h>

static PyObject* get_caller_info(PyObject *self, PyObject *args) {
    PyCodeObject* code = PyEval_GetFrame()->f_code;
    return Py_BuildValue("(OO)", code->co_filename, code->co_name)
}

请注意,框架对象结构不属于公共API,使用风险自负。

使用traceback模块从Python完成同样的事情:

import traceback

def get_caller_info():
    filename, _, function_name, _ = traceback.extract_stack(limit=2)[1]
    return filename, function_name

此信息可能并不总是可靠的。例如,所有lambda函数都被命名为<lambda>

要从文件名中获取模块模块实例,您可以创建如下的缓存:

_filename_to_module = {os.path.realpath(module.__file__): module
                       for module in sys.modules.itervalues()
                       if hasattr(module, '__file__')}
module = _filename_to_module.get(filename)
if module is None:
    # refresh the cache and retry