Могу ли я узнать, где была определена собственная функция,
Нет, потому что он был определен в некотором исходном коде, написанном на C (или другом языке), которого у вас даже нет (или, может быть, у вас есть, но Python не знает, где он находится); все, что у вас есть, это DLL / so / dylib, которая возникла в результате его компиляции.
… или как называется функция?
Да. Обычно вы можете получить имя функции Ctypes C так же, как и многие другие объекты в Python: через специальный атрибут __name__
:
>>> import ctypes
>>> libm = ctypes.CDLL('libm.dylib')
>>> fabs = libm.fabs
>>> fabs
<_FuncPtr object at 0x1067ac750>
>>> fabs.__name__
'fabs'
self.function._objects указывает на DLL, но мне неясно, как или если я могу найти имя функции, чтобы найти его в исходном коде.
Вы не можете получить имя функции оттуда. Но вы можете получить имя библиотеки оттуда через атрибут _name
:
>>> fabs._objects['0']._name
'libm.dylib'
(Несмотря на подчеркивание, это открытый атрибут, как объясняют документы.)
Обычно это имя передается конструктору CDLL
или вызову cdll.LoadLibrary
. В Windows для библиотек, загруженных с помощью волшебства cdll.spam
, я думаю, что вы на самом деле получите разрешенный путь, например 'D:\path\to\spam.dll'
, а не просто 'spam'
или 'spam.dll'
, но я не уверен.
Кроме того, возможно ли войти в функцию при ее вызове?
Нет, поскольку функция представляет собой скомпилированный машинный код; он не имеет никакого байт-кода Python для вас.
Конечно, вы можете подключить отладчик, такой как Visual Studio, lldb или gdb, и войти в машинный код таким образом .