IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaçage autre langage Python Discussion :

Interface Python/C++ que choisir ? vos avis svp


Sujet :

Interfaçage autre langage Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juillet 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Interface Python/C++ que choisir ? vos avis svp
    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

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    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)

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cdef extern from "math.h": 
        double exp(double x)
    A noter tout de même que le gain en rapidité dépend de la "proximité" du codage Python par rapport au C. Par exemple, si on utilise à fond les structures de données Python qui n'existent pas en C (le "long" de Python par exemple), on oblige le code compilé à faire appel en permanence à l'API Python, ce qui fait qu'on ne gagne plus rien.

    Prenons un exemple: une fonction Python qui calcule e à la puissance x en passant par les séries.

    1- version en pur Python:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def expo1(x, eps=1e-15):
        """calcul de e puissance x par les séries"""
        n, t, s = 0, 1.0, 1.0
        while t/s>eps:
            n += 1
            t = t*x/n
            s = s + t
        return s
    2- version en Cython avec la solution "décorateur" => dans un fichier séparé appelé ici "test01bib.pyx" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from cython import cclass, ccall, cfunc, returns as creturns, locals as clocals
    #############################################################################
    @ccall
    @creturns(double)
    @clocals(x=double, eps=double, n=int, t=double, s=double)
    def expo2(x, eps=1e-15):
        """calcul de e puissance x par les séries"""
        n, t, s = 0, 1.0, 1.0
        while t/s>eps:
            n += 1
            t = t*x/n
            s = s + t
        return s
    le décorateur "ccall" indique le type de fonction. Ici, ce sera une fonction qu'on pourra appeler à partir du C et à partir du Python. Il y a d'autres types: "cclass" pour une classe et "cfunc" pour appel uniquement à partir du C.

    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"):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    python setup.py build_ext --inplace
    Avec un setup.py qui contient (NB: pas de caractères accentués, même dans les commentaires!):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from distutils.core import setup
    from distutils.extension import Extension
    from Cython.Distutils import build_ext
     
    ext_modules = [Extension("test01bib", ["test01bib.pyx"])]
     
    setup(
      name = 'bibliotheque',
      cmdclass = {'build_ext': build_ext},
      ext_modules = ext_modules
    )
    Et on importe cette fonction compilée avec (elle sera extraite directement de "test01bib.pyd"):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from test01bib import expo2
    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:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [build]
    compiler = mingw32


    [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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cdef extern from "math.h": 
        double exp(double x)
     
    #############################################################################
    @ccall # pour appel possible par du C ou par du Python
    @creturns(double)
    @clocals(x=double)
    def exp2(x):
        """calcul de e puissance x par la bibliothèque C """
        return exp(x)
    Une fois compilé par Cython, ce code permettra à un programme en pur Python, après une simple importation, d'appeler exp2 qui appellera directement le exp de la bibliothèque C.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    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)

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    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"
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    Eh bien écoute rien à faire

    Voici mon code C++, rien de plus simple

    test.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <iostream>
     
    int add(int a, int b)
    {
        return a+b;
    }
    test.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef TEST_H_INCLUDED
    #define TEST_H_INCLUDED
     
    int add(int a, int b);
     
    #endif
    addition.pyx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    cdef extern from "test.h":
        cdef int add(int, int)
     
     
    cpdef ajouter(a, b):
        cdef int val_1 = a
        cdef int val_2 = b
        cdef int result = add(val_1, val_2)
        return result
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cython addition.pyx --cplus
    Mon addition.cpp sort sans problème...

    setup.py

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from distutils.core import setup, Extension
     
    ext = Extension(
        "ajout", ["addition.pyx"],
        language="c++",
        include_dirs=["/home/fred1599/Desktop"],
        libraries=['test'],
        extra_link_args=[],
        )
     
    setup (ext_modules = [Extension('test', ['test.cpp'])],)
    Fonctionne bien comme ci-dessous, mais même message d'erreur après l'import de la lib.

    Résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ addition.cpp -o addition.so -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing $(pkg-config python --cflags)
    La compilation se passe bien, mais au niveau de l'import

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import addition
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: ./addition.so: undefined symbol: _Z3addii
    Du coup si j'arrive à faire fonctionner ce petit code, ça roulera pour moi, mais rien à faire, alors qu'en C ça va tout seul.
    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)

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    As-tu essayé l'exemple à télécharger?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    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)

  9. #9
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    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)

  10. #10
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    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?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  11. #11
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    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?
    cython fichier.pyx --cplus

    Peut-être faudrait-il avant essayer d'exécuter une fonction de la bibliothèque standard C++? Genre sqrt de math.h?
    C'est plutôt un standard du C, j'ai rien fais de spécial, mon code fonctionne aussi bien en C qu'en C++, si tu vires les includes, non?
    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)

  12. #12
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    cython fichier.pyx --cplus
    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.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  13. #13
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    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.
    Pourquoi pour le include "test.h" manquant dans le fichier cpp? J'avais fais la modif ça ne change rien.

    Ensuite j'ai remodifié pour test.cpp, j'ai fais beaucoup d'autres tests, mais sans réussite.

    test.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include "test.h"
     
    using namespace std;
     
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    int add(int a, int b)
    {
        return a+b;
    }
     
    #ifdef __cplusplus
    }
    #endif
    test.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifndef TEST_H_INCLUDED
    #define TEST_H_INCLUDED
     
    using namespace std;
     
    int add(int a, int b);
     
    #endif
    addition.pyx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cdef extern from "test.h":
        int add(int, int)
     
    cpdef ajouter(x, y):
        cdef int result = add(x, y)
        return result
    cython addition.pyx --cplus

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import addition
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: ./addition.so: undefined symbol: _Z3addii
    Voilà toujours la même erreur
    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)

  14. #14
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    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.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  15. #15
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    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.
    Mouais j'ai tenté d'autres choses, donc on sait jamais, bref rien ne fonctionne de ce côté non plus.

    test.cpp + test.h ===> test.so
    gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -fPIC -I/usr/include/python2.7 -c test.cpp -o addition.o

    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)

  16. #16
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -fPIC -I/usr/include/python2.7 -c test.cpp -o addition.o
    Tu envisages de compiler test.cpp en C++ avec gcc? Et que fait là 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.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  17. #17
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    Bon il y a du nouveau

    J'ai utilisé setup.py du tuto

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from distutils.core import setup
    from Cython.Build import cythonize
     
    setup(ext_modules = cythonize(
               "addition.pyx",                 # our Cython source
               sources=["test.cpp"],  # additional source file(s)
               language="c++",             # generate C++ code
          ))
    ça me génère un fichier test.so

    Maintenant quand j'import j'ai cette erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import test
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: dynamic module does not define init function (inittest)
    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)

  18. #18
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Essaie de t'inspirer de l'exemple à télécharger.

    Son setup.py est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    from distutils.core import setup
    from distutils.extension import Extension
    from Cython.Distutils import build_ext
     
    setup(
      name = 'Demos',
      ext_modules=[
        Extension("rectangle",
                  sources=["rectangle.pyx", "cpp_rect.cpp"], # Note, you can link against a c++ library instead of including the source
                  include_dirs=["."],
                  language="c++"),
        ],
      cmdclass = {'build_ext': build_ext},
     
    )
    Il est donc possible de mettre test.cpp dans le setup, comme il serait aussi possible de mettre sa version compilée séparément test.so. Mais la syntaxe n'est pas la même que la tienne.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  19. #19
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    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)

  20. #20
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonsoir!

    On va y arriver!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

Discussions similaires

  1. vos avis svp
    Par yan dans le forum Qt
    Réponses: 16
    Dernier message: 15/04/2008, 16h22
  2. [Config desktop] Vos avis svp
    Par guitou12 dans le forum Ordinateurs
    Réponses: 39
    Dernier message: 13/07/2007, 12h36
  3. Vos avis sur les Blog's SVP
    Par Marc Lussac dans le forum Evolutions du club
    Réponses: 9
    Dernier message: 16/02/2005, 16h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo