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é...
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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,
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 <chris_invalid@yahoo.fr> wrote in message news:<20050309011056.50627181@linuxcestcomplique.fr>...
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é...
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,
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,
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)
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,
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 ?
On 09 Mar 2005 16:17:22 GMT, "F. Petitjean" <littlejohn.75@news.free.fr>
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 ?
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 ?
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,
On 9 Mar 2005 01:56:06 -0800, philippe.dalet@voila.fr (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 ?
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 ?