Привет, я использую C Python API.
Я хочу извлечь исходный код объекта функции.
Я хочу чистый код Python (например, def func: …), но если это сложно, то я хочу
получить как минимум байтовые коды.
Вот мой код C ++, который я получаю PyCodeObject от PyFunctionObject.
//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».
Но я хочу сделать это с помощью Python API.
P.S
Я предполагаю, что член co_code PyCodeObject является байтовым массивом.
Я использовал представление визуальной отладочной памяти Visual Studio и увидел примыкающий байт памяти члена co_code, но он выглядит как массив байтовых кодов (возможно).
Во-первых, PyCodeObject->co_code
это сгенерированный байт-код, а не чистый исходный код Python.
В Python мы могли бы использовать inspect.getsource
чтобы получить чистый исходный код Python. И в C, вы также можете использовать его через PyObject_CallMethod
Других решений пока нет …