Comments on: Appeler du code C depuis Python avec ctypes http://sametmax.com/appeler-du-code-c-depuis-python-avec-ctypes/ Deux développeurs en vadrouille qui se sortent les doigts du code Wed, 05 Feb 2014 12:15:31 +0000 hourly 1 http://wordpress.org/?v=3.3.1 By: Sam http://sametmax.com/appeler-du-code-c-depuis-python-avec-ctypes/#comment-15981 Sam Thu, 21 Nov 2013 13:45:21 +0000 http://sametmax.com/?p=5811#comment-15981 D'abord, je t'invite à <a href="http://sametmax.com/template-de-demande-daide-en-informatique/" rel="nofollow">lire ceci</a>. Ensuite, je te recommande de l'appliquer sur le forum de l'<a href="http://afpy.org/" rel="nofollow">afpy</a>, puisque des commentaires de blog ne sont pas un bon moyen de communiquer pour aider au debug. D’abord, je t’invite à lire ceci. Ensuite, je te recommande de l’appliquer sur le forum de l’afpy, puisque des commentaires de blog ne sont pas un bon moyen de communiquer pour aider au debug.

]]>
By: Joks http://sametmax.com/appeler-du-code-c-depuis-python-avec-ctypes/#comment-15980 Joks Thu, 21 Nov 2013 12:17:43 +0000 http://sametmax.com/?p=5811#comment-15980 Bonjour. tout d'abord je tiens a vous remercier pour cet EXCELENT tuto ! simple, et tres bien expliqué ! J'ai crée une DLL qui fonctionne. je l'ai tester avec un autre programme en C, et il arrive bien à utiliser les fonction de cette DLL. Néanmoins cela ne fonctionne pas lors de l’interfaçage avec python... toutes vos étapes fonctionnent jusqu'à ce que j'éssaie d'utiliser une fonction de la dll : res = zelib.addition(2, 3) me renvoie : AttibuteError: function 'multiplier' not found Auriez-vous une solution ? car cela fait plusieurs jours que je n'en trouve pas... (j'ai tenté de jeter un oeil à la doc python mais sans résultats...) ^^' Je vous en serais infiniment reconnaissant si vous pouviez m'aider. cordialement. Bonjour.

tout d’abord je tiens a vous remercier pour cet EXCELENT tuto ! simple, et tres bien expliqué !

J’ai crée une DLL qui fonctionne. je l’ai tester avec un autre programme en C, et il arrive bien à utiliser les fonction de cette DLL.
Néanmoins cela ne fonctionne pas lors de l’interfaçage avec python…
toutes vos étapes fonctionnent jusqu’à ce que j’éssaie d’utiliser une fonction de la dll :
res = zelib.addition(2, 3)
me renvoie : AttibuteError: function ‘multiplier’ not found

Auriez-vous une solution ? car cela fait plusieurs jours que je n’en trouve pas… (j’ai tenté de jeter un oeil à la doc python mais sans résultats…) ^^’

Je vous en serais infiniment reconnaissant si vous pouviez m’aider.

cordialement.

]]>
By: FX http://sametmax.com/appeler-du-code-c-depuis-python-avec-ctypes/#comment-8802 FX Sat, 11 May 2013 10:22:24 +0000 http://sametmax.com/?p=5811#comment-8802 Je connaissais pas non plus. Nous a priori on n'a pas trop de libs existantes, tout le code est entièrement fait main avec amour, donc Cython ou C c'est bien plus approprié ;) (D'ailleurs, je suis en train de commencer à tester Cython, c'est vraiment sympa, tu fais la même chose qu'en C en plus sûr et en 3 fois moins de lignes, mais ça manque un poil de doc pour le moment...) Je connaissais pas non plus. Nous a priori on n’a pas trop de libs existantes, tout le code est entièrement fait main avec amour, donc Cython ou C c’est bien plus approprié ;)

(D’ailleurs, je suis en train de commencer à tester Cython, c’est vraiment sympa, tu fais la même chose qu’en C en plus sûr et en 3 fois moins de lignes, mais ça manque un poil de doc pour le moment…)

]]>
By: Sam http://sametmax.com/appeler-du-code-c-depuis-python-avec-ctypes/#comment-8772 Sam Fri, 10 May 2013 11:30:36 +0000 http://sametmax.com/?p=5811#comment-8772 Je ne connaissais pas le projet. Je ne connaissais pas le projet.

]]>
By: kontre http://sametmax.com/appeler-du-code-c-depuis-python-avec-ctypes/#comment-8767 kontre Fri, 10 May 2013 08:05:08 +0000 http://sametmax.com/?p=5811#comment-8767 Vous avez essayé de comparer avec <a href="http://cffi.readthedocs.org/" rel="nofollow">cffi</a> ? Vous avez essayé de comparer avec cffi ?

]]>
By: FX http://sametmax.com/appeler-du-code-c-depuis-python-avec-ctypes/#comment-8720 FX Mon, 06 May 2013 20:09:23 +0000 http://sametmax.com/?p=5811#comment-8720 @Kontre: Héhé, ça conviendrait parfaitement à mon boulot, merci pour les liens, je vais jeter un oeil quand j'aurai le temps! Nous on ne va pas aussi loin que plusieurs Go, mais on a des TIFF de quelques 500Mo, donc les extensions C c'est carrément utile ;) @Kontre: Héhé, ça conviendrait parfaitement à mon boulot, merci pour les liens, je vais jeter un oeil quand j’aurai le temps!

Nous on ne va pas aussi loin que plusieurs Go, mais on a des TIFF de quelques 500Mo, donc les extensions C c’est carrément utile ;)

]]>
By: kontre http://sametmax.com/appeler-du-code-c-depuis-python-avec-ctypes/#comment-8719 kontre Mon, 06 May 2013 19:27:02 +0000 http://sametmax.com/?p=5811#comment-8719 La plupart des gens rajoutent une extension dans setup.py, oui. Moi je fais de la recherche, donc je développe pour ma boite en interne et mes programmes sont utilisés par peut-être 5 personnes. J'ai bon espoir que ça monte autour de 10 ! ^^ Tout ça pour dire que j'ai pas de problème de déploiement. Je n'ai qu'un module en cython, mais il est central pour l'appli en question (affichage d'images de plusieurs Go) et je n'ai aucun souci de stabilité avec. J’atteins la vitesse d'exécution du même programme écrit en C, point de vue perfo ça dépote. Pour l'utilisation, j'appelle le module comme un module python, avec pyximport : http://docs.cython.org/src/userguide/source_files_and_compilation.html#pyximport. Ça me permet notamment d'installer le module sur ma machine en mode "dev" (avec <code>pip -e module</code> par exemple) et le module est compilé automatiquement à l'import si besoin. Pour les tests et le développement c'est top. Pour éviter les soucis de compilation, j'ai utilisé ce qui est indiqué dans la partie "MinGW + NumPy + pyximport at runtime" sur la page http://wiki.cython.org/InstallingOnWindows. La plupart des gens rajoutent une extension dans setup.py, oui. Moi je fais de la recherche, donc je développe pour ma boite en interne et mes programmes sont utilisés par peut-être 5 personnes. J’ai bon espoir que ça monte autour de 10 ! ^^ Tout ça pour dire que j’ai pas de problème de déploiement. Je n’ai qu’un module en cython, mais il est central pour l’appli en question (affichage d’images de plusieurs Go) et je n’ai aucun souci de stabilité avec. J’atteins la vitesse d’exécution du même programme écrit en C, point de vue perfo ça dépote.

Pour l’utilisation, j’appelle le module comme un module python, avec pyximport : http://docs.cython.org/src/userguide/source_files_and_compilation.html#pyximport. Ça me permet notamment d’installer le module sur ma machine en mode “dev” (avec pip -e module par exemple) et le module est compilé automatiquement à l’import si besoin. Pour les tests et le développement c’est top.

Pour éviter les soucis de compilation, j’ai utilisé ce qui est indiqué dans la partie “MinGW + NumPy + pyximport at runtime” sur la page http://wiki.cython.org/InstallingOnWindows.

]]>
By: FX http://sametmax.com/appeler-du-code-c-depuis-python-avec-ctypes/#comment-8718 FX Mon, 06 May 2013 18:41:54 +0000 http://sametmax.com/?p=5811#comment-8718 @Kontre: Faut vraiment que je me penche dessus. J'ai un petit a priori négatif sur Cython pour le moment, j'ai un peu l'impression que c'est pas super stable. Je sais bien que des tas de trucs (comme SciPy) l'utilisent, mais j'hésite quand même. Au niveau déploiment, je suppose que tu ajoutes juste une extension dans ton <code>setup.py</code>? Sinon tu l'utilises pour quel genre de projets? Et puis je rejoins Etienne, si tu as des histoires à raconter sur des questions de Python/C/Ctypes/Cython, Sam, je suis preneur aussi! @Kontre: Faut vraiment que je me penche dessus. J’ai un petit a priori négatif sur Cython pour le moment, j’ai un peu l’impression que c’est pas super stable. Je sais bien que des tas de trucs (comme SciPy) l’utilisent, mais j’hésite quand même.

Au niveau déploiment, je suppose que tu ajoutes juste une extension dans ton setup.py? Sinon tu l’utilises pour quel genre de projets?

Et puis je rejoins Etienne, si tu as des histoires à raconter sur des questions de Python/C/Ctypes/Cython, Sam, je suis preneur aussi!

]]>
By: reg http://sametmax.com/appeler-du-code-c-depuis-python-avec-ctypes/#comment-8709 reg Mon, 06 May 2013 09:25:05 +0000 http://sametmax.com/?p=5811#comment-8709 Bon, le plus souvent, on utilise pas ctypes pour un développement nouveau mais quand on veut utiliser une lib existante en C/C++. Car oui, ça marche aussi avec C++ mais si c'est beaucoup plus relou car il faut faire un wrapper à grand renfort d'extern et de simuler du procédural ; mais ça marche. Je déconseille l'utilisation de ctypes en direct! Prenez un peu de temps pour en faire une interface python indépendante et propre ; vous le le regretterez pas car ainsi quand ça vous pètera au visage, vous saurez clairement d'où ça vient. Bon, le plus souvent, on utilise pas ctypes pour un développement nouveau mais quand on veut utiliser une lib existante en C/C++. Car oui, ça marche aussi avec C++ mais si c’est beaucoup plus relou car il faut faire un wrapper à grand renfort d’extern et de simuler du procédural ; mais ça marche.

Je déconseille l’utilisation de ctypes en direct! Prenez un peu de temps pour en faire une interface python indépendante et propre ; vous le le regretterez pas car ainsi quand ça vous pètera au visage, vous saurez clairement d’où ça vient.

]]>
By: kontre http://sametmax.com/appeler-du-code-c-depuis-python-avec-ctypes/#comment-8706 kontre Mon, 06 May 2013 08:05:57 +0000 http://sametmax.com/?p=5811#comment-8706 Pypy ne supporte pas bien numpy (même si ça progresse), c'est pas bon pour les scientifiques (pour les autre je dis pas). Je confirme pour numpy et cython. Dès qu'un algo ne se vectorise pas, il faut faire des boucles. Et les grosses boucles python, ben c'est lent, comparé au C. La dernière fois que j'ai utilisé cython, j'ai gagné un facteur 100 simplement en rajoutant quelques types. @FX si tu veux accélérer ton code numpy, essaie cython, c'est vraiment fait pour. Il faudrait que je me motive à faire un article sur cython, mais rapidement voilà quelques avantages : - le code python est valide en cython. Ça veut dire qu'on peut transformer du python en cython juste en changeant l'extension, et qu'écrire du cython c'est écrire du python. On garde aussi toute l'introspection... - le code est transformé en C de manière très optimisée, mais on conserve les exceptions, on évite les buffer overflow, segmentation fault... - il est possible d'appeler du C directement depuis cython (ça j'ai pas trop fait encore, perso) - les tableaux numpy sont mappés en tableaux C - on peut soit compiler à l'installation via un setup.py, soit compiler à la volée, ce qui est juste parfait pour développer (c'est mis en cache, on ne recompile pas si rien n'a changé). - si il y a une exception, la trace indique la ligne du fichier C et celle du fichier .pyx d'origine Il n'y a bien sûr strictement absolument aucun désavantage ! :P Pypy ne supporte pas bien numpy (même si ça progresse), c’est pas bon pour les scientifiques (pour les autre je dis pas).

Je confirme pour numpy et cython. Dès qu’un algo ne se vectorise pas, il faut faire des boucles. Et les grosses boucles python, ben c’est lent, comparé au C. La dernière fois que j’ai utilisé cython, j’ai gagné un facteur 100 simplement en rajoutant quelques types.

@FX si tu veux accélérer ton code numpy, essaie cython, c’est vraiment fait pour.

Il faudrait que je me motive à faire un article sur cython, mais rapidement voilà quelques avantages :
- le code python est valide en cython. Ça veut dire qu’on peut transformer du python en cython juste en changeant l’extension, et qu’écrire du cython c’est écrire du python. On garde aussi toute l’introspection…
- le code est transformé en C de manière très optimisée, mais on conserve les exceptions, on évite les buffer overflow, segmentation fault…
- il est possible d’appeler du C directement depuis cython (ça j’ai pas trop fait encore, perso)
- les tableaux numpy sont mappés en tableaux C
- on peut soit compiler à l’installation via un setup.py, soit compiler à la volée, ce qui est juste parfait pour développer (c’est mis en cache, on ne recompile pas si rien n’a changé).
- si il y a une exception, la trace indique la ligne du fichier C et celle du fichier .pyx d’origine

Il n’y a bien sûr strictement absolument aucun désavantage ! :P

]]>