2012-07-19 142 views
7

我是Python的初學者。當我試圖用類型庫在Mac OS X Lion的下面的Python代碼示例:Mac OS X Lion Python Ctype CDLL錯誤lib.so.6:找不到圖像

#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進行一些配置。

非常感謝,

瑞奇

回答

14

Mac OS X上的共享庫往往具有擴展.dylib代替.so。在這種情況下,/usr/lib/libc.dylib是你想要的,所以加載libc.dylib

+0

感謝凱文,它現在的作品。 – Gickian 2012-07-19 06:50:46

4

OS X使用 「名爲.dylib」,其共享對象的擴展,所以你需要使用 「libc.dylib」 代替。

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")) 

不太清楚所不同的是,這些替代品之間的什麼,似乎都很好地工作!