2012-04-18 6 views
18

Estoy explorando Python. Tengo curiosidad sobre las ataduras de pitón. ¿Alguien podría explicar cómo es posible que pueda tener acceso a bibliotecas C desde Python?enlaces de python, ¿cómo funciona?

+1

Qué parte de [extemb] (http://docs.python.org/extending/index.html) que no entiendes? –

+1

Te sugiero que hagas una búsqueda en Google de "enlaces de Python C". – steveha

+2

"Estoy explorando Python."Aprender todo sobre Python es algo grandioso, pero probablemente deberías tener una muy buena comprensión del modelo de Python antes de profundizar en las vinculaciones C. Entenderás cómo funciona el sistema de dirección asistida mucho mejor una vez que sabes conducir –

Respuesta

25

Hay varias formas de llamar al código escrito en C desde Python.

En primer lugar, está el módulo ctypes en la biblioteca estándar. Le permite cargar una biblioteca de vínculos dinámicos (DLL en Windows, bibliotecas compartidas .so en Linux) y funciones de llamada desde estas bibliotecas, directamente desde Python. Tales bibliotecas generalmente se escriben en C.

En segundo lugar, en el caso de CPython existe la API Python/C. Se puede usar de dos formas principales:

Una biblioteca de enlace dinámico se puede escribir en C de forma que CPython lo trate como un módulo (podrá importarlo en sus programas de Python). La API de Python/C permite que la biblioteca defina funciones que están escritas en C pero que aún se pueden llamar desde Python. La API es muy poderosa y proporciona funciones para manipular todos los tipos de datos de Python y acceder a las partes internas del intérprete.

La segunda forma de utilizar la API C es incrustar Python en un programa escrito en C. El programa C puede entonces crear módulos integrados escritos en C y exponer funciones C, al igual que en el enlace dinámico enfoque bibliotecario. La API también permite que el programa ejecute scripts que luego pueden importar y usar los módulos incorporados. Esto se puede usar para crear un sistema de complemento basado en Python.

Los "enlaces" se implementan como una biblioteca de Python pura usando ctypes o como una biblioteca de enlace dinámico que usa Python/C API. La segunda opción a veces se usa con herramientas como SWIG que facilitan la tarea al generar el código "placa de caldera" o Boost.Python que proporciona una API C++ encima de la API Python/C facilitando la interfaz con el código C++.

Además lee: Foreign Function Interface

6

La respuesta es simple, el intérprete python (CPython) está escrito en C y puede llamar a otras bibliotecas C dinámicamente, su módulo de extensión C o código C incorporado puede llamarse fácilmente desde cualquier otro código C.

CPython permite ganchos especiales para que pueda llamar a otros códigos C o llamar desde otro código C. Ni siquiera necesita ser C, cualquier lenguaje que compila con código nativo y tiene la misma convención de llamadas.

Para un caso simple, considere crear un programa llamado mython, que puede cargar cualquier biblioteca compartida e intenta llamar a una función run, p.

lib = dlopen("mylib.so", RTLD_LAZY); 
func = dlsym(lib, "run"); 
(*func)(); 

lo tanto, en forma que haya cargado un módulo y llamó su código, CPython hace eso, pero de una manera más compleja, proporcionando mejores interfaces y objetos para pasar alrededor, además de que hay otras complejidades involucradas de gestión de memoria, gestión de hilos etc.

Por lo tanto, la implementación de la plataforma de Python debe coincidir con el idioma en el que se está extendiendo, por ejemplo CPython no es extensible en Java, pero la implementación de Java de Python llamada Jython se puede extender en Java y, de forma similar, la implementación .NET IronPython se puede extender en los lenguajes .Net.

+2

Hay muchas cosas escritas en C. Pero muchas cosas escritas en C * no * son extensibles en C. Lo que hace especial a Python ? –

+0

@Anurag ¿Es correcto que python no sea extensible, por ejemplo, a Java? – ashim

+0

@ IgnacioVazquez-Abrams ver edición –

Cuestiones relacionadas