Python 为什么加载libc共享库时会出现';图书馆装载机&x27;对象不可调用";错误

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:

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: /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')
,等等。