|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Ingénieur Inscription : juillet 2012 Messages : 3 ![]() |
Bonsoir
Je poste ce message car je cherche m'exercer dans l'interfaçage Python/C++ et je voudrais avoir vos avis sur l'outil "optimal" à utiliser. J'ai un peu fait joujou avec SWIG (exemple de base sur une fonction) mais en recherchant sur internet, j'ai vu qu'il existait les outils suivants: - SWIG - Cython - SIP - Boost Python Quel est celui que vous me conseillerez d'utiliser et pourquoi ? Si vous avez eu l'occasion de vous en servir, pouvez-vous me faire part de vos retours ? En vous remerciant |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Fred Enseignant Inscription : juillet 2006 Messages : 1 303 ![]() |
Avec C++, celui ayant meilleur réputation est boost, sinon pour l'interfaçage C/python je préfère cython.
Ce qui m'a bloqué avec boost est la doc que je ne trouve pas toujours très clair. Bref pour C++, boost est très puissant. SWIG pour l'avoir testé, j'aime pas, pas adhérer, et je ne trouve pas très performant. SIP pas testé, donc je n'affirme rien.
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein) |
|
|
00
|
|
|
#3 | ||||||||||
|
Expert Confirmé
![]() ![]() Inscription : décembre 2007 Messages : 1 766 ![]() |
Bonjour,
Dans la liste donnée, je ne connais que Cython, et je le trouve très intéressant. Comme il y a longtemps que je n'ai pas programmé en C/C++, j'apprécie de ne pas avoir à le faire... Un des avantages que j'y vois, c'est qu'en utilisant la solution "décorateur", on peut accélérer des fonctions Python sans modifier leur code. Si on accepte de programmer en Python en visant Cython, on peut utiliser directement les fonctions de la bibliothèque C (la doc parle aussi de C++). Par exemple, pour utiliser la fonction exp dans une fonction compilée Cython, il suffira de la définir comme suit: Code :
Prenons un exemple: une fonction Python qui calcule e à la puissance x en passant par les séries. 1- version en pur Python: Code :
Code :
Le reste est évident: on précise les types de données utilisées pour que le compilateur C sache quoi faire. On compile avec (ce qui fabrique "test01bib.pxd"): Avec un setup.py qui contient (NB: pas de caractères accentués, même dans les commentaires!): Code :
Voilà. On peut maintenant faire des essais pour comparer la solution en pur Python avec la solution Cython: avec 1 million de valeurs au hasard, la solution Cython est 10 fois plus rapide que la solution Python! Bonus: sous Windows, comme j'ai Visual C, Cython le prend par défaut. Quand je veux qu'il utilise plutôt mingw32, je place dans le même répertoire un fichier texte appelé "setup.cfg" contenant: [Edit] J'ai dit plus haut qu'on pouvait utiliser directement les fonctions de bibliothèques C/C++. Cela veut dire qu'on peut créer facilement en Python compilé par Cython, une interface pour utiliser des bibliothèques C/C++ et les appeler directement à partir du code en pur Python. Par exemple: Code :
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos... Mes recettes python: http://www.jpvweb.com |
||||||||||
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Fred Enseignant Inscription : juillet 2006 Messages : 1 303 ![]() |
Salut Tyrtamos,
Si t'as une solution pour faire tourner du code C++ avec cython, je veux bien, du genre utiliser une fonction externe d'une bibliothèque créée en C++ dans un fichier de type pyx, je signe Sinon le C, ça passe nickel avec cython. Pour le C++, je suis très embêté...
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein) |
|
|
00
|
|
|
#5 |
|
Expert Confirmé
![]() ![]() Inscription : décembre 2007 Messages : 1 766 ![]() |
Bonjour fred1599,
J'ai vu seulement que le sujet était abordé assez longuement dans la doc (http://wiki.cython.org/WrappingCPlusPlus). Il y a de plus un exemple qu'on peut télécharger (http://wiki.cython.org/WrappingCPlus...=cythoncpp.tgz), et qui parait assez simple. Si tu es dans le bain du C++: essaie, et dis si ça marche! Ça m'intéresse, mais je n'ai pas touché au C++ depuis pas mal de temps (2005) et j'ai "des trous dans mes lacunes"
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos... Mes recettes python: http://www.jpvweb.com |
|
|
00
|
|
|
#6 | ||||||||||
|
Membre Expert
![]() Fred Enseignant Inscription : juillet 2006 Messages : 1 303 ![]() |
Eh bien écoute rien à faire
Voici mon code C++, rien de plus simple test.cpp Code :
Code :
Code :
setup.py Code :
Résultat Code :
g++ addition.cpp -o addition.so -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing $(pkg-config python --cflags) Code :
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein) |
||||||||||
|
|
00
|
|
|
#7 |
|
Expert Confirmé
![]() ![]() Inscription : décembre 2007 Messages : 1 766 ![]() |
As-tu essayé l'exemple à télécharger?
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos... Mes recettes python: http://www.jpvweb.com |
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Fred Enseignant Inscription : juillet 2006 Messages : 1 303 ![]() |
Non je vais regarder
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein) |
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Fred Enseignant Inscription : juillet 2006 Messages : 1 303 ![]() |
J'ai fais quelques modifs, j'ai utilisé un autre setup.py et regardé le makefile, mais rien à faire, j'ai toujours la même erreur lors de l'importation.
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein) |
|
|
00
|
|
|
#10 |
|
Expert Confirmé
![]() ![]() Inscription : décembre 2007 Messages : 1 766 ![]() |
Pour que le code Cython dans le .pyx réussisse à appeler la fonction écrite en C++, il faut que cette fonction soit compilée/liée avant en tant que bibliothèque (et non comme un exécutable): comment fais-tu pour ça?
Peut-être faudrait-il avant essayer d'exécuter une fonction de la bibliothèque standard C++? Genre sqrt de math.h?
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos... Mes recettes python: http://www.jpvweb.com |
|
|
00
|
|
|
#11 | ||
|
Membre Expert
![]() Fred Enseignant Inscription : juillet 2006 Messages : 1 303 ![]() |
Citation:
Citation:
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein) |
||
|
|
00
|
|
|
#12 |
|
Expert Confirmé
![]() ![]() Inscription : décembre 2007 Messages : 1 766 ![]() |
Non. Dans ton exemple perso plus haut, je parle de la compilation de test.cpp accompagné de test.h. Cela m'étonnerait que Cython s'en occupe.
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos... Mes recettes python: http://www.jpvweb.com |
|
|
00
|
|
|
#13 | |||||||||
|
Membre Expert
![]() Fred Enseignant Inscription : juillet 2006 Messages : 1 303 ![]() |
Citation:
Ensuite j'ai remodifié pour test.cpp, j'ai fais beaucoup d'autres tests, mais sans réussite. test.cpp Code :
Code :
Code :
création du fichier addition.cpp gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -fPIC -I/usr/include/python2.7 -c /home/fred1599/Desktop/addition.cpp -o /home/fred1599/Desktop/addition.o Pas d'erreur, cette ligne est récupérée du setup.py addition.o créé g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro /home/fred1599/Desktop/addition.o -o /home/fred1599/Desktop/addition.so addition.so créé sans erreur Utilisation de la lib avec python Code :
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein) |
|||||||||
|
|
00
|
|
|
#14 |
|
Expert Confirmé
![]() ![]() Inscription : décembre 2007 Messages : 1 766 ![]() |
C'est toujours non.
test.cpp + test.h ===> test.so Tu fais comment? Cython ne s'occupe certainement pas de compiler la bibliothèque C++ contenant les fonctions qui seront considérées comme "extern" par le code Cython.
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos... Mes recettes python: http://www.jpvweb.com |
|
|
00
|
|
|
#15 | ||
|
Membre Expert
![]() Fred Enseignant Inscription : juillet 2006 Messages : 1 303 ![]() |
Citation:
Citation:
Pas d'erreur g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro addition.o -o addition.so pas d'erreur et ensuite?
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein) |
||
|
|
00
|
|
|
#16 |
|
Expert Confirmé
![]() ![]() Inscription : décembre 2007 Messages : 1 766 ![]() |
Avec:
Code :
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -fPIC -I/usr/include/python2.7 -c test.cpp -o addition.o Désolé, mais je crois qu'il y a un problème de méthode. Test.cpp doit être compilé en C++ séparément de "addition". Ceci en mode "bibliothèque", c'est à dire sans le main. Mais je ne sais plus comment on fait.
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos... Mes recettes python: http://www.jpvweb.com |
|
|
00
|
|
|
#17 | ||||
|
Membre Expert
![]() Fred Enseignant Inscription : juillet 2006 Messages : 1 303 ![]() |
Bon il y a du nouveau
J'ai utilisé setup.py du tuto Code :
Maintenant quand j'import j'ai cette erreur Code :
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein) |
||||
|
|
00
|
|
|
#18 | ||
|
Expert Confirmé
![]() ![]() Inscription : décembre 2007 Messages : 1 766 ![]() |
Essaie de t'inspirer de l'exemple à télécharger.
Son setup.py est: Code :
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos... Mes recettes python: http://www.jpvweb.com |
||
|
|
00
|
|
|
#19 |
|
Membre Expert
![]() Fred Enseignant Inscription : juillet 2006 Messages : 1 303 ![]() |
J'avais déjà essayé, j'avais la même erreur après une compilation correcte, mais je crois avoir compris le principe, en fait du C++ on va recevoir un fichier de type C grâce au setup.py.
Il me semble que mon erreur se trouve dans mon fichier.pyx, car je ne prend pas en compte le "using namespace std;" Bref je reverrais cela demain si possible. Merci pour tout, je te tiens au courant
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein) |
|
|
00
|
|
|
#20 |
|
Expert Confirmé
![]() ![]() Inscription : décembre 2007 Messages : 1 766 ![]() |
Bonsoir!
On va y arriver!
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos... Mes recettes python: http://www.jpvweb.com |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com