使用ctypes从dll列出导出的函数

Tom*_*Tom 35 python dll ctypes shared-libraries

有没有办法知道从dllpython外部函数库导出哪些函数ctypes

如果可能的话,通过c了解有关导出函数的详细信息types.

如果是,有人可以提供一小段代码吗?

Mar*_*ark 15

我不认为ctypes提供此功能.在Windows上使用visual studio:

DUMPBIN -EXPORTS XXX.DLL
Run Code Online (Sandbox Code Playgroud)

或者对于Windows上的mingw:

objdump -p XXX.dll
Run Code Online (Sandbox Code Playgroud)


xea*_*its 12

如果你在Linux上,有一个方便的实用程序nm来列出共享库的内容(在Linux上总是有一个方便的实用程序,特别是对于C的东西).

这是关于它的问题.

你将它与-D旗帜一起使用:nm -D ./libMyLib.so


Ale*_*lli 7

通常,这是不可能的,因为通常,动态加载的库不会携带您需要的元信息.有可能通过特定于系统的方式在某些特殊情况下获取该信息,但ctypes本身不会获取该信息.您可以记录通过这样的信息ctypes(见例如restypeargtypes函数指针的属性),但你必须通过不同的方式获得后,才.


dil*_*ten 6

以下方法适用于 Windows 和 Ubuntu。对于 Windows,需要Cygwin

假设,有一个c类似下面的文件,名称为test.c.

int func1(int a, int b){
    return a + b;
}

int func2(int a, int b){
    return a - b;
}
Run Code Online (Sandbox Code Playgroud)

并且test.dll使用以下命令将上述 c 代码编译为文件:

gcc -shared -Wl,-soname,adder -o test.dll -fPIC test.c
Run Code Online (Sandbox Code Playgroud)

下面的 Python 脚本查找 Pythontest.dll可以使用的函数。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from subprocess import Popen, PIPE

out = Popen(
    args="nm ./test.dll", 
    shell=True, 
    stdout=PIPE
).communicate()[0].decode("utf-8")

attrs = [
    i.split(" ")[-1].replace("\r", "") 
    for i in out.split("\n") if " T " in i
]

from ctypes import CDLL

functions = [i for i in attrs if hasattr(CDLL("./test.dll"), i)]

print(functions)
Run Code Online (Sandbox Code Playgroud)

我在 Windows 中得到的输出如下:

['func1', 'func2']
Run Code Online (Sandbox Code Playgroud)

我在 Ubuntu 中得到的输出如下:

['_fini', 'func1', 'func2', '_init']
Run Code Online (Sandbox Code Playgroud)

上面列表的项目是_FuncPtr类的对象。


Pet*_*ood 5

@Mark的答案使用Visual Studio工具.

在Windows上,您还可以使用Dependency Walker获取dll导出的函数名称.

有时名称被破坏,不能用作有效的python函数名.

您可以使用getattr获取损坏函数的句柄,例如:

mylib = ctypes.cdll('mylib.dll')
my_func = getattr(mylib, '_my_func@0')

my_func()
Run Code Online (Sandbox Code Playgroud)