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 :

Compatibilité Python/C(++) ?


Sujet :

Interfaçage autre langage Python

  1. #1
    Membre averti
    Homme Profil pro
    Développeur en formation
    Inscrit en
    juillet 2013
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en formation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : juillet 2013
    Messages : 300
    Points : 409
    Points
    409
    Par défaut Compatibilité Python/C(++) ?
    Bonjour,
    Je programme en Python et c'est, pour l'instant, le seul langage que je connais. En revanche, j'ai des amis qui programment en C++ et je sais que Python et le C(++) on plein de choses en commun, à commencer que Python est écrit en C++. De ce que j'ai lu, il serait possible d'utiliser des modules écrits en C++ ou en C pour Python. Je serais donc intéressé, mes amis pourront enfin m'aider à programmer !
    Je voulais donc mettre tout ça un peu au clair, comment ça marche et tout, si on a besoin de passer par un autre module ou lire des cours Python et cetera...
    Merci d'avance !
    Bouddha : Tout n'est qu'illusion en ce bas monde.
    Jésus : Tout est amour divin.
    Einstein : Tout est relatif dans cet espace-temps.
    Moi : Tout est binaire sur ce forum.

  2. #2
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    14 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 14 602
    Points : 24 774
    Points
    24 774
    Par défaut
    Salut,

    Techniquement on a d'un cote le script Python et de l'autre le code C/C++. Si on veut appeler C/C++ depuis le script Python, il va falloir construire une passerelle qui permette de passer de l'un a l'autre.

    Le boulot de la passerelle sera de faire la conversion des paramètres d'appels et de retour et le codage sera plus ou moins "complique".

    Comme c'est "formel" et répétitif, il y a des outils qui permettent de faire ça: les plus populaires sont Cython et sip - utilise pour Qt.

    Comme c'est un boulot de "conversion" difficile de ne pas connaître (un minimum) Python et C/C++ pour réaliser ces passerelles.

    je sais que Python et le C(++) on plein de choses en commun, à commencer que Python est écrit en C++
    L’interpréteur Python a été réalisé dans plusieurs langages qui ont donne: Jython, IronPython, Pypy, CPython.
    CPython est probablement celui que vous utilisez.
    Cette information apparaît lorsque vous lancez l’interpréteur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Python 3.3.2 (default, Nov  5 2013, 22:36:42) 
    [GCC 4.1.2 20080704 (Red Hat 4.1.2-54)] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    Vous avez aussi un module Python appelé ctypes qui permet d'interfacer une librairie C sans utiliser l'artillerie lourde.

    Pour en savoir plus lisez les Cours et tutoriels pour apprendre la programmation Python , par exemple : Apprendre à programmer avec Python 3 par Gérard Swinnen

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Développeur en formation
    Inscrit en
    juillet 2013
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en formation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : juillet 2013
    Messages : 300
    Points : 409
    Points
    409
    Par défaut
    Merci, je m'intéresse plus particulièrement à sip car je l'ai déjà et j'ai installé Qt ainsi que PyQt4. Je ne me suis pas encore penché sur les tutos faute de temps mais quelle est, selon vous, la méthode la plus simple pour convertir ces scripts, sans que le rédacteur (en C++) ait besoin d'adapter son script ?
    Bouddha : Tout n'est qu'illusion en ce bas monde.
    Jésus : Tout est amour divin.
    Einstein : Tout est relatif dans cet espace-temps.
    Moi : Tout est binaire sur ce forum.

  4. #4
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    14 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 14 602
    Points : 24 774
    Points
    24 774
    Par défaut
    Salut,

    Je ne vois pas quels scripts vous voulez convertir.

    Prenez le temps de lire un minimum de tutos.
    Ce genre de technologies (un peu) compliquée.
    Elle demande (un minimum) d'efforts pour voir a quoi ça ressemble et de prendre le temps de vous approprier (un minimum) la terminologie.

    En tant que débutant Python, vous pouvez vous contentez de poster du code. Avec de la patience, le lecteur pourra essayer de comprendre en faisant tourner le code dans son interpréteur.
    L'histoire que vous racontez en français n'a pas besoin d’être "précise".

    Avec ces techno. "montrer" ce que vous faites, c'est poster un script Python, le code C++, celui de la "passerelle".
    Pour essayer de reproduire, il faut avoir le compilo, le Python,... les commandes de construction....
    De fait, plus grand monde n'aura du temps pour vous aider.
    Si vous avez un problème et que vous ne savez pas le formuler clairement, personne ne s'y intéressera ou on vous dira RTFM.
    note: arriver a "formuler clairement", c'est augmenter la chance de trouver la réponse dans la doc. ou avec Google.

    Vous ne pourrez compter que sur vous même.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Homme Profil pro
    Développeur en formation
    Inscrit en
    juillet 2013
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en formation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : juillet 2013
    Messages : 300
    Points : 409
    Points
    409
    Par défaut
    Merci, ce que je voulais dire c'est si on pouvait importer des modules 100% C++ sans y ajouter quoi que ce soit, pas de classes py_int par exemple. Je vois les tutos notamment sur CYTHON.
    Bouddha : Tout n'est qu'illusion en ce bas monde.
    Jésus : Tout est amour divin.
    Einstein : Tout est relatif dans cet espace-temps.
    Moi : Tout est binaire sur ce forum.

  6. #6
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    14 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 14 602
    Points : 24 774
    Points
    24 774
    Par défaut
    A mon sens, ce n'est même pas imaginable.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    3 743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 3 743
    Points : 7 283
    Points
    7 283
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je réagis avec un peu (beaucoup) de retard sur cette question.

    Si on a un code source purement C ou C++, on peut le faire appeler par Cython, et c'est alors Cython qui fait l'interface. Le code en pur C ou C++ est compilé pendant le traitement Cython, et intégré au code Python compilé: l'ensemble se retrouve dans un fichier .pyd, prêt à être importé comme n'importe quel module.

    On peut aussi créer carrément l'interface en C ou C++ en utilisant les fonctions de l'API Python. C'est plus compliqué qu'en Cython, il y a quelques pièges (gestion mémoire, compteurs de référence, ...), et ce n'est pas forcément plus performant. Mais c'est probablement plus "propre" par rapport à l'interpréteur Python.

    J'ai fait un petit tuto sur le sujet en testant différentes solutions: "Extension de Python en C et C++" => http://python.jpvweb.com/mesrecettes...thon_en_c_et_c.

    J'ai dit que c'était "possible", pas que c'était "simple"... En tout cas, il est chaleureusement conseillé d'avoir quelques connaissances en développement C ou C++, et il ne faut pas vouloir traiter ainsi des problèmes trop gros.
    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 confirmé
    Avatar de fred1599
    Homme Profil pro
    Développeur python
    Inscrit en
    juillet 2006
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur python
    Secteur : Santé

    Informations forums :
    Inscription : juillet 2006
    Messages : 2 862
    Points : 4 792
    Points
    4 792
    Par défaut
    +1 Tyrtamos

    tyrtamos a tout dit, et il a tout à fait raison sur la difficulté de ce genre de travail, une bonne connaissance du C/C++ selon le choix est impérative.
    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
    Membre averti
    Homme Profil pro
    Développeur en formation
    Inscrit en
    juillet 2013
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en formation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : juillet 2013
    Messages : 300
    Points : 409
    Points
    409
    Par défaut
    Merci, je cherche du côté de Cython, ça me semble en effet être la voie la plus intéressante. Je suis sur plein de projets à la fois en ce moment....
    Bouddha : Tout n'est qu'illusion en ce bas monde.
    Jésus : Tout est amour divin.
    Einstein : Tout est relatif dans cet espace-temps.
    Moi : Tout est binaire sur ce forum.

  10. #10
    Membre averti
    Homme Profil pro
    Développeur en formation
    Inscrit en
    juillet 2013
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en formation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : juillet 2013
    Messages : 300
    Points : 409
    Points
    409
    Par défaut
    J'ai une question qui peut paraître un peu idiote mais je suis sous windows, j'ai téléchargé Cython qui est sous la forme d'un package et je me demande comment faire pour compiler sous windows, n'ayant trouvé que des tutos pour linux.
    Bouddha : Tout n'est qu'illusion en ce bas monde.
    Jésus : Tout est amour divin.
    Einstein : Tout est relatif dans cet espace-temps.
    Moi : Tout est binaire sur ce forum.

  11. #11
    Expert éminent
    Avatar de tyrtamos
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    3 743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 3 743
    Points : 7 283
    Points
    7 283
    Billets dans le blog
    6
    Par défaut
    Mon tuto sur Cython a été fait sous Windows, et j'explique comment choisir entre les compilateurs MS Visual Studio et mingw32: il t'en faut au moins un! Et ce n'est pas cython qui l'amène. Il faut donc le télécharger et l'installer (http://www.mingw.org/).

    Une fois fait, essaie au moins les exemples que j'ai mis qui sont très simples. Tu attaqueras tes propres sources après.
    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

  12. #12
    Futur Membre du Club
    Profil pro
    Enseignant Chercheur
    Inscrit en
    juillet 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Cython : bof! Apprendre C / C++, et utiliser ctypes, c'est bien plus efficace (et simple). Il suffit de compiler une fonction C en DLL, par exemple, sous windows ( "gcc -shared ..."), et de l'appeler en python en la chargeant avec la fonction CDLL de ctypes.
    Cython produit du code C pas fameux, et c'est normal.
    Exemple de programme python avec DLL en C : http://berliozo.fr/tmp/win32.zip.
    Oui, il n'y a pas encore les sources, et c'est embarqué avec cx_freeze car redistribué à des néophytes, mais il n'y a pas de virus! C'est en cours d'élaboration.
    C'est long avec divers modules, etc...
    Quand j'aurai le temps, je posterai quelques exemples simples d'utilisation de ctypes.

  13. #13
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Développeur python
    Inscrit en
    juillet 2006
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur python
    Secteur : Santé

    Informations forums :
    Inscription : juillet 2006
    Messages : 2 862
    Points : 4 792
    Points
    4 792
    Par défaut
    Cython : bof! Apprendre C / C++, et utiliser ctypes, c'est bien plus efficace (et simple). Il suffit de compiler une fonction C en DLL, par exemple, sous windows ( "gcc -shared ..."), et de l'appeler en python en la chargeant avec la fonction CDLL de ctypes.
    La plupart du temps ctypes est très efficace, mais si tu veux gagner encore 30 à 50% tu peux utiliser l'API C... Si tu utilises des tableaux, alors API numpy + API C ça cartonne! (en général aussi rapide que le C pur)

    Cependant ctypes est simple d'utilisation, et je le conseillerais autant que cython...

    Voici un exemple simple, d'une fonction qui ne retourne rien, mais qui modifie une chaine en prenant en paramètre le caractère à modifier et le caractère de remplacement.

    test.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
     
    void replace(char str[], char letter_s, char letter_d)
    {
        int i;
     
        for (i=0; str[i]!='\0'; i++)
            if (str[i] == letter_s)
                str[i] = letter_d;
    }


    Création de la librairie dynamique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -c test.c -o test.o
    gcc -o test.so -shared test.o


    Sur l'interpréteur python
    3.x


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> from ctypes import *
    >>> libstr = CDLL("/home/fred1599/test.so") # je cherche ma lib créée auparavant
    >>> string = c_char_p(b"Bonjour") # la chaine à modifier
    >>> char_s = c_char(b'o') # lettre à modifiée
    >>> char_d = c_char(b'k') # lettre de remplacement
    >>> libstr.replace(string, char_s, char_d) # utilisation de la fonction de la lib
    0
    >>> string.value # affichage de la valeur de la chaine de caractères
    b'Bknjkur'
    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
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    3 743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 3 743
    Points : 7 283
    Points
    7 283
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par TT187 Voir le message
    Cython : bof! Apprendre C / C++, et utiliser ctypes, c'est bien plus efficace (et simple).
    On "peut" appeler du code C ou C++ avec Cython, mais sa vocation première est de compiler du code Python. Il suffit de lui ajouter ce qui est nécessaire pour que la compilation se fasse (déclarations de variables en particulier), et que puisse se construire l'interface entre les 2 langages. Si on en reste là, il n'est pas nécessaire de connaître le C, à part les types utilisés par le C.

    Par exemple, voilà du code Python qui sera facilement converti en C et compilé par Cython. J'utilise ici les décorateurs de Cython, et vous voyez que le code Python interne à la fonction n'a pas été modifié: on a seulement ajouté le type de fonction à créer (ccall), les déclarations des variables internes avec leur type (clocals), et le type de la valeur retournée (creturns):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @ccall
    @creturns(int)
    @clocals(a=int, b=int)
    def pgcd(a,b):
        """Plus Grand Commun Diviseur entre les 2 nombres entiers a et b"""
        while b<>0:
            a,b=b,a%b
        return a
    Un avantage supplémentaire est de pouvoir utiliser dans le code compilé en C des variables de type Python mais inconnus en C (long de Python, list, dict, ...). Mais, bien sûr, cela nécessite alors des appels multiples à l'API Python qui diminuent, voire annulent, le gain de temps espéré par la compilation.

    Bref, il n'y a pas vraiment de concurrence directe entre Cython et ctypes: si on veut rester en code Python, c'est Cython.

    Mais si on sait développer en C, ctypes est très bien. Cependant, dans ce cas, je préfère nettement la solution API Python (http://docs.python.org/2/extending/index.html) qui, bien qu'étant plus complexe, est plus homogène avec l'interpréteur Python et en respecte beaucoup mieux le fonctionnement (gestion mémoire, compteurs de référence, prise en compte du GIL, etc...).
    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
    Membre averti
    Homme Profil pro
    Développeur en formation
    Inscrit en
    juillet 2013
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en formation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : juillet 2013
    Messages : 300
    Points : 409
    Points
    409
    Par défaut
    Tient, je peux utiliser des fonctions C++ en Python du coup avec ctypes ? ça me paraît très intéressant, il faut que le programme C++ soit compilé pour ça ? (vous n'auriez pas un tuto français pour ctypes ?). Merci d'avance.
    Bouddha : Tout n'est qu'illusion en ce bas monde.
    Jésus : Tout est amour divin.
    Einstein : Tout est relatif dans cet espace-temps.
    Moi : Tout est binaire sur ce forum.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compatibilité entre Python et Python XY
    Par Timeflyer dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 09/02/2014, 13h13
  2. Réponses: 2
    Dernier message: 19/12/2012, 21h33
  3. Compatibilité Python 3.2 & SFML 1.6
    Par Linkht dans le forum Programmation multimédia/Jeux
    Réponses: 1
    Dernier message: 20/05/2012, 03h50
  4. Compatibilité entre Python et Geany !
    Par AndreuMichel dans le forum Général Python
    Réponses: 15
    Dernier message: 03/03/2012, 11h48
  5. Compatibilité Python VS Vista
    Par Zorro dans le forum Général Python
    Réponses: 9
    Dernier message: 22/03/2007, 20h58

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