Python ctypes-获取CFUNCTYPE的名称

时间:2018-09-12 01:29:26

标签: python dll ctypes

我正在寻找一些我尚未使用pdb编写的代码。

(Pdb) self.function
<CFunctionType object at 0x000000DC768E0E18>
(Pdb) type(self.function)
<class 'ctypes.CFUNCTYPE.<locals>.CFunctionType'>
(Pdb) dir(self.function)
['__bool__', '__call__', '__class__', '__ctypes_from_outparam__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_argtypes_', '_b_base_', '_b_needsfree_', '_flags_', '_objects', '_restype_', 'argtypes', 'errcheck', 'restype']
(Pdb) self.function._flags_
1
(Pdb) self.function._objects
{'0': <CDLL 'C:\path', handle 7ffe26465400 at 0xdc74ad2908>}

我是否可以找出self.function的定义位置,或者该函数的名称是什么? self.function._objects指向DLL,但是我不清楚如何或是否可以找到该函数的名称,因此可以在源代码中查找它。

还可以在调用该函数时进入该函数吗?通过以下方式在代码中调用它:

self.function(*self.args)

1 个答案:

答案 0 :(得分:1)

  

我可以找出在哪里定义了self.function

不,因为它是用某些您甚至没有的用C(或另一种语言)编写的源代码定义的(或者也许是,但是Python不知道它在哪里);您所拥有的只是编译时产生的DLL / so / dylib。


  

...或函数的名称是什么?

是的。通常,您可以使用与Python中许多其他对象相同的方式来获得ctypes C函数的名称:通过__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,然后以这种方式进入计算机代码