2011-07-05 14 views
12

Sé que hay muchas maneras de interfaz de la función C en Python: la Python C API, scipy.weave, ctypes, pyrex/cython, SWIG, Boost.Python, Psyco ... ¿Cuáles son cada uno de ellos mejor para? ¿Por qué debería usar un método dado en lugar de otros? ¿Qué debería considerarse cuando necesito elegir un enlace entre Python y C?¿Cuáles son las diferentes opciones para interconectar C (o C++) con Python?

Sé que algunas discusiones acerca de eso, sino que todo parece incompleta ...

Sé que algunas preguntas sobre stackoverflow están relacionados también. Por ejemplo:

+2

-1. Esta pregunta es demasiado amplia. –

+0

@Steven Rumbalski: No estoy de acuerdo. Esta es una buena pregunta, aunque supongo que me encantaría escuchar lo que el usuario realmente * intentó *. –

+0

@ Platinum Azure: me quedé un poco boquiabierto con el -1, pero al final decidí que una buena respuesta a esta pregunta debería ser muy larga y detallada. También sería en gran parte subjetivo. –

Respuesta

8

No he utilizado todos estos métodos aunque yo los he investigado en un momento u otro ...

El Python API C: Para escribir código C que compila a un módulo de Python que se puede importar en Pitón. O para escribir un módulo de Python que actúa como código "pegamento" para interactuar con alguna biblioteca C.

scipy.weave: Le permite empuja bits de código C en el código Python, si está usando NumPy y SciPy para hacer el trabajo numérico, mira en esto. El código C sería como una cadena, como, weave.inline ('printf ("% s", foo)') por ejemplo.

ctypes: Módulo python que le permite llamar al código C desde su código python. Básicamente importa la biblioteca compartida y luego realiza llamadas a su API. Se necesita algo de trabajo para ordenar los datos dentro y fuera de esas llamadas. Si está buscando utilizar una biblioteca de C existente que usted u otra persona escribió, comenzaría aquí.

pyrex/Cython: Le permite escribir código Python (utilizando una sintaxis especial) que se generará en código C (que puede ser importado como un módulo de Python) y, por supuesto, correr más rápido que si se ha ejecutado a través del intérprete de Python. Esto es algo así como la ruta "Python C API", solo genera el código C para usted. Es útil si tiene un trozo de código que es su cuello de botella y es realmente lento. Reescribe esa función usando cython e impórtala desde el código de llamada.

SWIG: Genera el código contenedor para una biblioteca C/C++. Deberías terminar con un módulo de Python que puedes importar y usar.

Boost.Python: Este es el que menos conozco. Me parece que es similar a SWIG, aunque usted mismo escriba la capa de envoltura, pero con mucha ayuda de las macros/funciones de Boost.

Psyco: Aumenta la velocidad de su código Python un poco, nunca he tenido mucha suerte con esto. No perdería el tiempo con eso. Perfile su código, encuentre sus cuellos de botella y agréguelos usando una de las técnicas anteriores.

4

Esta es sólo una breve respuesta a una parte de su pregunta, pero:

ctypes es probablemente mejor cuando se tiene una biblioteca preexistente C que quieres usar con Python.

El Python API C es el más indicado, o bien quieren escribir algo en C que utiliza aspectos de Python, o quiere escribir una extensión para Python en C. (Cython es otra forma de hacer esto.)

Por supuesto, es probable que ambos se expliquen con mucho más detalle en algunas de las respuestas a las preguntas de SO a las que se vincula en su pregunta.

+0

He intentado tanto SWIG como ctypes recientemente, y los ctypes resultaron ser un dolor de cabeza mucho menor. Puede simplemente compilar su C/C++ como una biblioteca compartida, luego importar y llamar a las funciones de un script de Python. – Chriszuma

+0

pero, 'ctypes' no puede crear objetos de clase C++ fácilmente. –

+0

@ 陈家胜 Cierto, que es donde entra la respuesta de dgrant. (Aunque siempre es posible proporcionar un contenedor de interfaz C para las partes de C++). – JAB

Cuestiones relacionadas