17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Bonnes pratiques et optimisation du code<br />

CHAPITRE 13<br />

['__builtins__', '__doc__', '__file__', '__name__', '_exemple',<br />

'_newclass', '_object', '_swig_getattr', '_swig_setattr',<br />

'_swig_setattr_nondynamic', 'cvar', 'fact', 'get_time', 'my_mod']<br />

>>> exemple.get_time()<br />

'Sun Sep 25 10:24:14 2005\n'<br />

>>> exemple.fact(67)<br />

0<br />

À SAVOIR Construction locale d’une extension<br />

Il est possible de construire l’extension localement pour procéder à des essais avant une installation dans<br />

Python, en utilisant la commande python setup.py build_ext –inplace à la place<br />

d’install. Dans ce cas, le module est accessible lorsque le répertoire de compilation est dans les chemins<br />

de recherche de l’interpréteur Python.<br />

Utilisation de ctypes<br />

Pour du code déjà compilé, ctypes permet de l’utiliser directement depuis Python en<br />

le chargeant dynamiquement. Il n’y a plus besoin dans ce cas d’écrire une extension.<br />

Dans l’exemple ci-dessous, la bibliothèque libc est utilisée directement via ctypes.<br />

Utilisation de libc via ctypes<br />

>>> import ctypes<br />

>>> libc = ctypes.CDLL("libc.dylib")<br />

>>> libc.printf("Ecriture dans la sortie standard via libc\n")<br />

Ecriture dans la sortie standard via libc<br />

Création d’un module d’extension<br />

La création d’une extension pour Python se réalise en deux étapes :<br />

création d’un module en C, en respectant un modèle fourni par les API C de<br />

Python ;<br />

installation du module comme extension de Python, par le biais du module<br />

distutils.<br />

Pour notre exemple, le module C met en œuvre une fonction banale max(), qui prend en<br />

paramètres deux entiers et renvoie le plus grand. Cette fonction ne sera pas plus rapide<br />

que son équivalent en Python mais est parfaite pour un exemple d’extension simple.<br />

Pour mettre en œuvre max() côté C, il est nécessaire :<br />

de garnir la fonction pour la rendre compréhensible par l’interpréteur ;<br />

de définir une table de méthodes qui publie la fonction pour la rendre accessible à<br />

l’interpréteur ;<br />

d’initialiser l’interpréteur pour qu’il prenne en charge le module d’extension.<br />

469

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!