2010-11-23 16 views
7

Estoy tratando de comprender weave.inline para ajustar el código C en mis programas de Python. El código de abajo simplemente toma la matriz y sistemas múltiples Numpy todos sus elementos por 2.¿Cómo uso scipy.weave.inline junto con bibliotecas de C externas?

inl.py

import numpy 
import scipy.weave 

a = numpy.array([1.0, 2.0, 3.0]) 
N = a.shape[0] 

print a 
code = \ 
    """ 
    int i; 
    for(i = 0; i < N; i++) 
    { 
    a[i] = a[i] * 2; 
    } 
    """ 

scipy.weave.inline(code, ['a','N']) 
print a 

Entonces quiero realizar algunas funciones de código en línea a bibliotecas externas. Que sea la multiplicación trivial por 2. Así se crea dos archivos:

mult.c

#include "mult.h" 

float mult(float n) 
{ 
    return n * 2; 
} 

mult.h

float inc(float n); 

Ahora quiero utilizar la función mult en mi código en línea Pero no sé cómo puedo vincular mis archivos C con el código en línea de Python. Traté de compilar archivos C como biblioteca compartida y pasarlos como encabezados y bibliotecas en el tejido, pero fue en vano. ¿Alguna sugerencia?

Respuesta

7

he hecho esto con éxito, llamando a las funciones matemáticas de R a través de weave.inline() código (bajo Ubuntu Linux).

Primero, compila tus funciones C como una biblioteca compartida. En mi caso, me agarró una versión reciente de R desde CRAN, e hice

./configure --enable-R-static-lib --enable-static --with-readline=no 
cd src/nmath/standalone/ 
make 

Ahora debe tener un archivo llamado libRmath.so. Si libpath es una cadena con el directorio que contiene libRmath.so, se puede hacer algo como

code = 'return_val = pbinom(100, 20000, 100./20000., 0, 1);' 
support_code = 'extern "C" double pbinom(double x, double n, double p, int lower_tail, int log_p);' 
weave.inline(code, support_code=support_code, 
    library_dirs=[libpath], libraries=["Rmath"], runtime_library_dirs=[libpath]) 

Nota un par de cosas. Las declaraciones de encabezado deben ir en support_code, no en code (no sé por qué), y tienen que tener el prefijo extern "C" porque son código C, no C++ (esto es estándar). Debería ser posible incluir archivos de encabezados en lugar de usar support_code (verifique los documentos para weave.inline), pero no lo he intentado. El nombre de la biblioteca es Rmath, pero el archivo de la biblioteca compartida es libRmath.so, en la convención de Unix habitual. Y la ruta a la biblioteca se especifica dos veces, una para vincular y una para la ejecución.

Espero que esto ayude!

1

Lo siento, no sé cómo hacer eso con weave. Ver sin embargo SO simple-wrapping-of-c-code-with-cython.

+0

He intentado con enlaces de C/Python como Cython, ctypes y SWIG.Weave parece ser la forma más sencilla de pasar matrices Numpy a C, por lo que quiero encontrar una forma de utilizar bibliotecas externas en su código. Además, ya tengo una pieza de código C en el tejido, y funciona muy bien. Gracias de todas formas. – user517893

1

poner la fuente de mult.c y mult.h en un objeto de cadena llamada extra_code, a continuación, añadir la siguiente línea en su invocación .weave

support_code=extra_code, 

También existe la opción de incluir las bibliotecas estándar de la siguiente :

headers = ["<math.h>"] 

disfrutar

Cuestiones relacionadas