我是Python的初学者。当我在Mac OS X Lion上尝试使用类型库的以下Python示例代码时:
#hello.py
from ctypes import *
cdll.LoadLibrary("libc.so.6")
libc = CDLL("libc.so.6")
message_string = "Hello World! Hello Python!\n"
libc.printf("Testing :%s",message_string)
//
发生错误如下:
Traceback (most recent call last):
File "cprintf.py", line 2, in <module>
cdll.LoadLibrary("libc.so.6")
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 431, in LoadLibrary
return self._dlltype(name)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 353, in __init__
self._handle = _dlopen(self._name, mode)
OSError: dlopen(libc.so.6, 6): image not found
谁能告诉我这是怎么回事?顺便说一下,我在Windows和Linux上试过这个;它运作良好。 我需要为ctype做一些配置。
非常感谢,
瑞奇
答案 0 :(得分:16)
Mac OS X上的共享库通常使用扩展名.dylib
而不是.so
。在这种情况下,您需要/usr/lib/libc.dylib
,因此请加载libc.dylib
。
答案 1 :(得分:4)
OS X使用“.dylib”扩展其共享对象,因此您需要使用“libc.dylib”。
答案 2 :(得分:0)
跨平台解决方案是使用以下内容:
import platform
import ctypes
libc = ctypes.cdll.LoadLibrary("libc.{}".format("so.6" if platform.uname()[0] != "Darwin" else "dylib"))
# or ctypes.CDLL("libc.{}".format("so.6" if platform.uname()[0] != "Darwin" else "dylib"))
不太确定这些替代方案之间的区别是什么,因为两者似乎都很好用!