如何从C python API中的PyCodeObject获取源代码?

时间:2018-08-01 10:24:31

标签: c++ cpython

嗨,我正在使用c python api。 我想提取功能对象的源代码。 我想要纯python代码(例如def func:...),但是如果很难,我想 至少获取py字节码。

这是我的C ++代码,是我从PyFunctionObject获取PyCodeObject的。

//pObject is PyFunctionObject which is python standard lib's function.
PyFunctionObject* pFunctionObject = (PyFunctionObject*)pObject;

PyCodeObject* codeObject = (PyCodeObject*)pFunctionObject->func_code;

PyObject* strObject = codeObject->co_code; //get code from code object

char * sourceCode = PyString_AsString(strObject); //convert to string

但是sourceCode变量(char *)始终仅显示1个字节。

我应该怎么得到这个? 在python代码方面有很多方法可以做到这一点,就像只使用'dis'或'inspect'模块一样。 但是我想通过c python api做到这一点。

P.S 我猜想PyCodeObject的co_code成员是一个字节数组。 我使用了Visual Studio调试内存视图,并看到了co_code成员的相邻内存字节,但它看起来像是字节码数组(也许)。

1 个答案:

答案 0 :(得分:0)

首先,PyCodeObject->co_code是生成的字节码,而不是纯Python源代码。

在Python中,我们可以使用inspect.getsource来获取纯Python源代码。在C语言中,您也可以通过PyObject_CallMethod

使用它