2012-07-19 10 views
7

Soy un principiante en Python. Cuando probé el siguiente ejemplo de código Python con la biblioteca de tipos en Mac OS X Lion:Mac OS X Lion Python Ctype Error de CDLL lib.so.6: imagen no encontrada

#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) 
// 

Se produjo un error de la siguiente manera:

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 

¿Puede alguien decirme qué es lo que pasa? Por cierto, probé esto en Windows y Linux; funcionó bien Necesito hacer alguna configuración para ctype.

Muchas gracias,

Ricky

Respuesta

14

Las bibliotecas compartidas en Mac OS X tienden a tener la extensión .dylib en lugar de .so. En este caso, /usr/lib/libc.dylib es lo que quiere, así que cargue libc.dylib.

+0

Gracias Kevin, funciona ahora. – Gickian

4

OS X utiliza ".dylib" para la extensión de sus objetos compartidos, por lo que es necesario utilizar "libc.dylib" en su lugar.

0

Una solución multiplataforma sería utilizar algo como esto:

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

muy seguro de cuál es la diferencia entre estas alternativas, ya que ambos parecen funcionar muy bien!

Cuestiones relacionadas