OVH Cloud OVH Cloud

C encapsule dans Python

4 réponses
Avatar
Christophe
Bonjour,

Je cherche à appeler une fonction en C à partir de Python et je suis en
train d'essayer Pyrex.
Une des choses que je n'ai pas bien saisi est s'il est possible de
manipuler directement les tableaux sans passer par une recopie ?

Par exemple soit la fonction qui additionne deux tableaux d'entiers :
void additionne_vecteur(int dimension, int *a, int *b, int *c)
{
int i;
for(i=0;i<dimension;i++)
c[i] = a[i] + b[i];
}

Est-ce que l'on peut la faire opérer sur des objets python ?
Ou à l'inverse est-il possible de définir de nouveaux objets sous Python
qui soient compatibles avec cette fonction ?

Je suis tombé sur la bibliothèque ctypes et j'avoue que je suis
maintenant encore plus embrouillé...

Merci d'avance,

4 réponses

Avatar
philippe.dalet
Regarde du côté de chez SWIG
un article est paru dans la revue Programmez. En quelques lignes
on peut interfacer le C/C++ avec python de manière très simple.


Philippe DALET
Laboratoire STS électronique
Lyp Champollion
av pezet
46100 FIGEAC
FRANCE



Christophe wrote in message news:...
Bonjour,

Je cherche à appeler une fonction en C à partir de Python et je suis en
train d'essayer Pyrex.
Une des choses que je n'ai pas bien saisi est s'il est possible de
manipuler directement les tableaux sans passer par une recopie ?

Par exemple soit la fonction qui additionne deux tableaux d'entiers :
void additionne_vecteur(int dimension, int *a, int *b, int *c)
{
int i;
for(i=0;i<dimension;i++)
c[i] = a[i] + b[i];
}

Est-ce que l'on peut la faire opérer sur des objets python ?
Ou à l'inverse est-il possible de définir de nouveaux objets sous Python
qui soient compatibles avec cette fonction ?

Je suis tombé sur la bibliothèque ctypes et j'avoue que je suis
maintenant encore plus embrouillé...

Merci d'avance,


Avatar
F. Petitjean
Bonjour,

Je cherche à appeler une fonction en C à partir de Python et je suis en
train d'essayer Pyrex.
Une des choses que je n'ai pas bien saisi est s'il est possible de
manipuler directement les tableaux sans passer par une recopie ?

Par exemple soit la fonction qui additionne deux tableaux d'entiers :
void additionne_vecteur(int dimension, int *a, int *b, int *c)
{
int i;
for(i=0;i<dimension;i++)
c[i] = a[i] + b[i];
}

Est-ce que l'on peut la faire opérer sur des objets python ?
Non. puisque des "objets python" ne sont pas représentés au niveau C par

des int *.
Par contre si vous voulez simplement manipuler des types numériques
import Numeric as N
dimension = 16
a = N.zeros((dimension,), N.Int) # à vérifier (je n'utilise que N.Float)
b = N.ones((dimension,), N.Int)
c = a + b
N.alltrue(c == b)
# devrait retourner 1 ou True
Ou à l'inverse est-il possible de définir de nouveaux objets sous Python
qui soient compatibles avec cette fonction ?
Vous pouvez toujours définir des objets python, le problème est que le

code C de votre fonction n'est pas générique puisqu'il qu'il ne traite
que des tableaux d'entiers. De plus vous pourriez améliorer le prototype
(l'interface) en saupoudrant avec des "const" bien sentis.

Je suis tombé sur la bibliothèque ctypes et j'avoue que je suis
maintenant encore plus embrouillé...
Si vous nous disiez réellement ce que vous désirez faire ?

En particulier les fonctionnalités du code C.
ctypes st très pratique mais cela suppose que le code C est dans un dso
(unix) ou une DLL (zin)

Merci d'avance,


Avatar
Christophe
On 09 Mar 2005 16:17:22 GMT, "F. Petitjean"
wrote :

Je cherche à appeler une fonction en C à partir de Python et je suis
en train d'essayer Pyrex.
Une des choses que je n'ai pas bien saisi est s'il est possible de
manipuler directement les tableaux sans passer par une recopie ?

Par contre si vous voulez simplement manipuler des types numériques

import Numeric as N
dimension = 16
a = N.zeros((dimension,), N.Int) # à vérifier (je n'utilise que
N.Float) b = N.ones((dimension,), N.Int)
c = a + b
N.alltrue(c == b)
# devrait retourner 1 ou True

Ou à l'inverse est-il possible de définir de nouveaux objets sous
Python qui soient compatibles avec cette fonction ?
Vous pouvez toujours définir des objets python, le problème est que le

code C de votre fonction n'est pas générique puisqu'il qu'il ne traite
que des tableaux d'entiers. De plus vous pourriez améliorer le
prototype(l'interface) en saupoudrant avec des "const" bien sentis.


Oui bien évidemment mon exemple n'était là que pour illustrer mon
propos. Une fonction aussi simple n'a aucun intérêt à être appelé par
Python.


Je suis tombé sur la bibliothèque ctypes et j'avoue que je suis
maintenant encore plus embrouillé...
Si vous nous disiez réellement ce que vous désirez faire ?

En particulier les fonctionnalités du code C.
ctypes st très pratique mais cela suppose que le code C est dans un
dso(unix) ou une DLL (zin)




Eh bien je souhaiterais ré-utiliser des fonctions développées en C qui
possèdent en interface des tableaux multidimensionnels d'entiers et de
réels. Ces fonctions sont infiniment plus compliquées que c=a+b et
surtout elles ont coûtées très cher à valider et à certifier.
Pour l'instant je m'en sors en utilisant Pyrex et en recopiant les
tableaux de Python vers le type correct en C mais c'est au prix d'une
perte importante en performance...
Est-il donc possible de procéder différemment ?


Avatar
Christophe
On 9 Mar 2005 01:56:06 -0800, (Philippe Dalet)
wrote :

Regarde du côté de chez SWIG
un article est paru dans la revue Programmez. En quelques lignes
on peut interfacer le C/C++ avec python de manière très simple.



J'avais déjà jeté un oeil quand j'hésitais entre SWIG et Pyrex. Pyrex me
semblait plus simple et plus souple (à mon avis). Cependant il
semblerait que j'ai cette embêtante limitation de ne pouvoir utiliser
directement les tableaux type 'int *' du C.
Est-ce que tu confirmes que SWIG ne possède pas cette limitation ?

Merci,