web-dev-qa-db-fra.com

python, comment ça marche?

J'explore le python. Je suis curieux de connaître les liaisons python. Quelqu'un pourrait-il expliquer comment il est possible que vous puissiez avoir accès aux bibliothèques C à partir de Python.

33
ashim

Il existe plusieurs façons d'appeler du code écrit en C à partir de Python.

Tout d'abord, il y a le module ctypes dans la bibliothèque standard. Il vous permet de charger une bibliothèque de liens dynamiques (DLL sous Windows, bibliothèques partagées .so sous Linux) et appeler des fonctions depuis ces bibliothèques, directement depuis Python. Ces bibliothèques sont généralement écrites en C.

Deuxièmement, dans le cas de CPython, il y a l'API Python/C . Il peut être utilisé de deux manières principales:

Une bibliothèque de liens dynamiques peut être écrite en C de telle manière que CPython la traitera comme un module (vous pourrez l'importer dans vos Python). L'API Python/C permet à la bibliothèque de définir des fonctions écrites en C mais toujours appelables depuis Python. L'API est très puissante et fournit des fonctions pour manipuler tous les types de données Python et accéder aux internes de l'interpréteur).

La deuxième façon d'utiliser l'API C est d'incorporer Python dans un programme écrit en C. Le programme C est alors capable de créer des modules intégrés écrits en C et d'exposer des fonctions C, un peu comme dans l'approche de bibliothèque de liens dynamiques. L'API permet également au programme d'exécuter des scripts qui peuvent ensuite importer et utiliser les modules intégrés. Cela peut être utilisé pour créer un plug-in basé sur Python système.

Les "liaisons" sont implémentées soit comme une pure bibliothèque Python utilisant des ctypes, soit comme une bibliothèque de liens dynamiques utilisant l'API Python/C. La deuxième option est parfois utilisée avec des outils comme SWIG qui rend la tâche plus facile en prenant soin de générer le code "Chaudière" ou Boost.Python qui fournit une API C++ en plus de Python/API C facilitant l'interface avec le code C++.

Pour en savoir plus: Interface de fonction étrangère

36
yak

La réponse est simple, l'interpréteur python (CPython) est écrit en C et il peut appeler d'autres bibliothèques C dynamiquement, votre module d'extension C ou le code C incorporé peuvent être facilement appelés à partir de n'importe quel autre code C.

CPython autorise des hooks spéciaux pour pouvoir appeler un autre code C ou être appelé à partir d'un autre code C. Il n'a même pas besoin d'être C, n'importe quel langage qui se compile en code natif et a la même convention d'appel.

Pour un cas simple, considérez que vous créez un programme appelé mython, qui peut charger n'importe quelle bibliothèque partagée et tente d'appeler une fonction run par ex.

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

Donc, de la manière dont vous avez chargé un module et appelé son code, CPython le fait mais de manière plus complexe, offrant de meilleures interfaces et objets à transmettre, et il existe d'autres subtilités impliquées dans la gestion de la mémoire, la gestion des threads, etc.

Ainsi, la plate-forme d'implémentation Python doit correspondre au langage dans lequel elle est étendue, par exemple CPython n'est pas extensible dans Java mais l'implémentation Java de Python appelée Jython peut être étendue dans Java et de même l'implémentation .NET IronPython peut être étendu dans les langages .Net.

9
Anurag Uniyal