Tengo la tarea de "envolver" la biblioteca de CA en una clase de Python. Los documentos son increíblemente vagos en este asunto. Parece que esperan que solo los usuarios avanzados de Python implementen ctypes. Bueno, soy un principiante en Python y necesito ayuda.
Alguna ayuda paso a paso sería maravillosa.
Entonces tengo mi biblioteca c. ¿Qué debo hacer? ¿Qué archivos pongo donde? ¿Cómo importo la biblioteca? Leí que podría haber una manera de "ajustar automáticamente" a Python.
(Por cierto, hice el tutorial de ctypes en python.net y no funciona. Lo que significa que estoy pensando que están asumiendo que debería poder completar el resto de los pasos.
De hecho, este es el error que obtengo con su código:
File "importtest.py", line 1
>>> from ctypes import *
SyntaxError: invalid syntax
¡Realmente me vendría bien un poco de ayuda paso a paso en esto! Gracias ~
fuente
>>>
en importtest.py? Cuando las personas publican un código que tiene>>>
en cada línea, significa que se está ejecutando en el shell interactivo. Para ejecutarlo desde un archivo, elimine>>>
(eso es 3> signos y un espacio) donde aparezca.>>>
s. Estos se imprimen mediante el shell interactivo y deben omitirse en su archivo fuente.>>>
en el archivo .py! ¡AY! ¡Nunca había visto eso antes!Respuestas:
Aquí hay un tutorial de ctypes rápido y sucio.
Primero, escriba su biblioteca C. Aquí hay un ejemplo simple de Hola mundo:
testlib.c
Ahora compílelo como una biblioteca compartida ( solución de mac que se encuentra aquí ):
Luego, escribe una envoltura usando ctypes:
testlibwrapper.py
Ahora ejecútelo:
Y deberías ver la salida
Si ya tiene una biblioteca en mente, puede omitir la parte del tutorial que no es de Python. Asegúrese de que ctypes pueda encontrar la biblioteca colocándola en
/usr/lib
otro directorio estándar. Si hace esto, no necesita especificar la ruta completa al escribir el contenedor. Si elige no hacer esto, debe proporcionar la ruta completa de la biblioteca al llamarctypes.CDLL()
.Este no es el lugar para un tutorial más completo, pero si solicita ayuda con problemas específicos en este sitio, estoy seguro de que la comunidad lo ayudará.
PD: Asumo que estás en Linux porque lo has usado
ctypes.CDLL('libc.so.6')
. Si tiene otro sistema operativo, las cosas pueden cambiar un poco (o bastante).fuente
La respuesta de Chinmay Kanchi es excelente, pero quería un ejemplo de una función que pasa y devuelve variables / matrices a un código C ++. Pensé que lo incluiría aquí en caso de que sea útil para otros.
Pasar y devolver un entero
El código C ++ para una función que toma un número entero y agrega uno al valor devuelto,
Guardado como archivo
test.cpp
, tenga en cuenta el externo "C" requerido (esto se puede eliminar para el código C). Esto se compila usando g ++, con argumentos similares a la respuesta de Chinmay Kanchi,Los usos de código Python
load_library
desde elnumpy.ctypeslib
supuesto de la ruta a la biblioteca compartida en el mismo directorio que el script en Python,Esto imprime 6 como se esperaba.
Pasar e imprimir una matriz
También puede pasar matrices de la siguiente manera, para que un código C imprima el elemento de una matriz,
que se compila como antes y se importa de la misma manera. El código de Python adicional para usar esta función sería,
donde especificamos la matriz, el primer argumento a
print_array
, como un puntero a una matriz Numpy de flotadores alineados, c_contiguous de 64 bits y el segundo argumento como un número entero que le dice al código C el número de elementos en la matriz Numpy. Esto luego impreso por el código C de la siguiente manera,fuente
import numpy as np
. De lo contrario, no puede encontrarnp.float64
y las otras cosas.En primer lugar: el
>>>
código que ve en los ejemplos de Python es una forma de indicar que es código Python. Se usa para separar el código Python de la salida. Me gusta esto:Aquí vemos que la línea que comienza con
>>>
es el código de Python, y el resultado es 9. Así es exactamente como se ve si inicia un intérprete de Python, que es la razón por la que se hace así.Nunca ingresa la
>>>
pieza en un.py
archivo.Eso se encarga de su error de sintaxis.
En segundo lugar, ctypes es solo una de las varias formas de empaquetar bibliotecas de Python. Otras formas son SWIG , que observará su biblioteca de Python y generará un módulo de extensión Python C que expone la API C. Otra forma es usar Cython .
Todos tienen ventajas e inconvenientes.
SWIG solo expondrá su API C a Python. Eso significa que no obtiene ningún objeto ni nada, tendrá que crear un archivo Python separado para hacerlo. Sin embargo, es común tener un módulo llamado say "wowza" y un módulo SWIG llamado "_wowza" que es el envoltorio de la API C. Esta es una forma agradable y sencilla de hacer las cosas.
Cython genera un archivo de extensión C. Tiene la ventaja de que todo el código Python que escribe se convierte en C, por lo que los objetos que escribe también están en C, lo que puede mejorar el rendimiento. Pero tendrá que aprender cómo interactúa con C, por lo que es un poco más de trabajo aprender a usarlo.
Los ctypes tienen la ventaja de que no hay código C para compilar, por lo que es muy bueno usarlo para empaquetar bibliotecas estándar escritas por otra persona, y ya existe en versiones binarias para Windows y OS X.
fuente