Python 为什么加载libc共享库时会出现';图书馆装载机&x27;对象不可调用";错误
从 ctypes模块可以从共享库/DLL加载C函数 在运行中自动转换简单的数据类型 Python和C语义如下所示:Python 为什么加载libc共享库时会出现';图书馆装载机&x27;对象不可调用";错误,python,linux,ctypes,libc,dynamic-loading,Python,Linux,Ctypes,Libc,Dynamic Loading,从 ctypes模块可以从共享库/DLL加载C函数 在运行中自动转换简单的数据类型 Python和C语义如下所示: import ctypes libc = ctypes.CDLL( '/lib/libc.so.6' ) # under Linux/Unix t = libc.time(None) # equivalent C code: t = time(NULL) print t 关于卢本图18.04 $ whereis libc libc:
import ctypes
libc = ctypes.CDLL( '/lib/libc.so.6' ) # under Linux/Unix
t = libc.time(None) # equivalent C code: t = time(NULL)
print t
关于卢本图18.04
$ whereis libc
libc: /usr/lib/x86_64-linux-gnu/libc.a /usr/lib/x86_64-linux-gnu/libc.so /usr/share/man/man7/libc.7.gz
$ locate libc.so
/lib/i386-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so
$ ls -l /usr/lib/x86_64-linux-gnu/libc.so
-rw-r--r-- 1 root root 298 Apr 16 16:14 /usr/lib/x86_64-linux-gnu/libc.so
我想知道为什么加载libc共享库时会出现“LibraryLoader”对象不可调用”错误
$python3--版本
Python 3.6.5
$python3
>>>导入ctypes
>>>libc=ctypes.cdll(“/usr/lib/x86_64-linux-gnu/libc.so”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:“LibraryLoader”对象不可调用
>>>libc=ctypes.cdll(“/lib/x86_64-linux-gnu/libc.so.6”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:“LibraryLoader”对象不可调用
>>>libc=ctypes.cdll(“/lib/i386-linux-gnu/libc.so.6”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:“LibraryLoader”对象不可调用
另请参见您混淆了小写
cdll
(a)和大写,后者是共享库的构造函数
此代码将按预期工作:
libc = ctypes.CDLL("/lib/x86_64-linux-gnu/libc.so.6")
您混淆了小写
cdll
(a)和大写,后者是共享库的构造函数
此代码将按预期工作:
libc = ctypes.CDLL("/lib/x86_64-linux-gnu/libc.so.6")
加载
/lib/x86\u 64-linux-gnu/libc.so.6
不是更好吗?否则Python脚本在运行时将需要C库开发包…@StephenKitt我认为这超出了问题的范围。这是关于如何正确加载库,而不是哪一个是最好的;我只是想降低复制意大利面的风险;-)(这将使答案与开始这一切的例子相对应)。谢谢。LibraryLoader(例如cdll
)与共享库的构造函数(例如cdll
)之间有什么区别?“他们能做同样的事吗?”蒂姆,我不知道该怎么说。所有这些都在文档中进行了解释,因此我只能从这里重复这些信息:LibraryLoader是一个对象,它允许您通过属性访问来加载库CDLL
(以及windl
和其他)是加载的库的类。基本上,cdll.foo==cdll('foo')
,windell.foo==windl('foo')
,等等。加载/lib/x86\u 64-linux-gnu/libc.so.6
不是更好吗?否则Python脚本在运行时将需要C库开发包…@StephenKitt我认为这超出了问题的范围。这是关于如何正确加载库,而不是哪一个是最好的;我只是想降低复制意大利面的风险;-)(这将使答案与开始这一切的例子相对应)。谢谢。LibraryLoader(例如cdll
)与共享库的构造函数(例如cdll
)之间有什么区别?“他们能做同样的事吗?”蒂姆,我不知道该怎么说。所有这些都在文档中进行了解释,因此我只能从这里重复这些信息:LibraryLoader是一个对象,它允许您通过属性访问来加载库CDLL
(以及windl
和其他)是加载的库的类。基本上,cdll.foo==cdll('foo')
,windl.foo==windl('foo')
,等等。