Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ctypes utilisation de C++ dans Python

Sujet résolu
    10 février 2018 à 13:15:41

    Bonjour à tous,

    Cela ne fait que quelques semaines que je fais du Python (donc je suis encore un peu un débutant dans ce langage :lol:) et j'aurai aujourd'hui besoin d'utiliser du code C++ (plusieurs fichier .cpp/.cc ainsi que des fichiers .h) dans mon programme Python.

    Je précise que je suis sur Windows et que j'utilise le compilateur MinGW pour compiler mes fichiers .cpp

    J'ai réussi à faire ce que je souhaitais avec un fichier ".cpp" compilé en ".o" puis créer une librairie ".so" que je charge dans mon code Python avec "ctypes.CDLL('nom_librairie.so')" cependant je bloque lorsque je souhaite créer une librairie à partir de plusieurs fichiers ".cpp" et ".h" qui sont dépendants entre eux (un fichier "test.cpp" peut inclure un "test2.h"...). J'ai aussi certain fichiers qui ont juste un ".h"...

    Quelqu'un pourrait-il m'expliquer comment créer une librairie ".so" à partir de tous ces fichiers ?

    Merci par avance :D

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      10 février 2018 à 13:44:20

      Ctypes et C++ impossible ! Il va falloir que tu te diriges vers cython par exemple, mais il en existe d'autres, suffit de faire une recherche avec C++ et python.

      ctypes c'est que pour du C.

      • Partager sur Facebook
      • Partager sur Twitter
        10 février 2018 à 15:39:57

        Ah bon... ?

        Pourtant certains y arrivent... je comprend pas exactement comment... : 

        https://stackoverflow.com/questions/34113762/create-a-shared-library-in-c-to-integrate-with-python

        https://stackoverflow.com/questions/4241415/import-c-function-into-python-program

        (j'ai réussi à reproduire l'exemple du deuxième lien...)

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          10 février 2018 à 16:21:29

          Dis-tu utiliser le mot clé extern ? Tu vas donc compiler en C. ctypes devient donc possible... seulement faudrait-il donner toutes les informations.

          Pour créer une lib tu as déjà testé ce lien ?

          • Partager sur Facebook
          • Partager sur Twitter
            10 février 2018 à 17:25:17

            Je ne sais pas vraiment comment ça marche donc je vais essayer d'expliquer ce que je cherche à faire.

            Je voudrai créer une fonction (la fonction extern) dans laquelle je compte utiliser des objets et méthodes d'autres classes (stockées dans des fichiers .h & .cpp appart) afin de faire un calcul spécifique et renvoyer le résultat via la fonction extern.

            A l'heure actuelle, je sais que c'est possible car j'ai fais des tests cette après-midi avec une classA dans un fichier qui est appelé dans le extern C puis je renvoi le résultat que génère ma classe via le return de la fonction externe C. 

            Cependant, pour aboutir à ce test j'ai dût créer les fichier ".o" des fichiers : "ClassA.cpp" et "functionExtern.cpp" puis j'ai utilisé les fichiers ".o" pour créer la librairie comme ci-dessous : 

            "C:\MinGW\bin\mingw32-g++.exe" -shared -Wl,-soname,library.so -o library.so ClassA.o functionExtern.o

            Et cela marche !

            Mais moi, je cherche à utiliser des classes déjà existantes en c++ et qui ont sont-elles même dépendantes d'autres librairies...

            Je pense que mon problème est au niveau du linkage. 

            Merci pour le lien :), je vais essayer et je reviendrai vers vous.

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              10 février 2018 à 17:37:32

              Ces classes existantes en C++, c'est toi qui les avait faîtes ?

              À partir du moment où c'est du C++, je ne touche pas à ctypes, d'ailleurs je l'utilise quasiment jamais ce module, à part quand je veux appeler une librairie spécifique d'un OS qui ne se trouve pas dans les modules python existants.

              On peut savoir pourquoi tu as besoin de cela ? C'est par curiosité ou par besoin ?

              • Partager sur Facebook
              • Partager sur Twitter
                11 février 2018 à 3:29:37

                Quand extern "C" est utilisé en C++, les règles de linkage du C s'appliquent, aucun mangling n'est fait sur le nom de la fonction. Il reste cependant possible d'utiliser toutes les constructions de C++ dans le corps de la fonction.

                Uchiwa2000 a écrit:

                Mais moi, je cherche à utiliser des classes déjà existantes en c++ et qui ont sont-elles même dépendantes d'autres librairies...

                Tu peux créer une petite interface à ta classe, un exemple:

                #include <iterator>
                #include <new>
                #include <vector>
                
                #include "vector_int.h"
                
                using const_vecptr_t = const std::vector<int>*;
                using vecptr_t = std::vector<int>*;
                
                extern "C" void* vector_new()
                {
                    try
                    {
                        return static_cast<void*>(new std::vector<int>);
                    }
                    catch (...)
                    {
                        return nullptr;
                    }
                }
                
                extern "C" void vector_delete(void* self)
                {
                    delete static_cast<vecptr_t>(self);
                }
                
                extern "C" int vector_at(const void* self, size_t index)
                {
                    return (*static_cast<const_vecptr_t>(self))[index];
                }
                
                extern "C" const int* vector_data(const void* self)
                {
                    return std::data(*static_cast<const_vecptr_t>(self));
                }
                
                extern "C" size_t vector_size(const void* self)
                {
                    return std::size(*static_cast<const_vecptr_t>(self));
                }
                
                // ...

                (On peut faire plus propre mais voilà l'idée)

                -
                Edité par Mad scientist 11 février 2018 à 5:17:45

                • Partager sur Facebook
                • Partager sur Twitter
                Un vrai cours de: (C | C++ | Haskell débutant | Haskell intermédiaire | Rust).
                Anonyme
                  11 février 2018 à 11:51:30

                  Sinon, il y a d'autres méthodes.

                  Quelques liens: introduction au cours de scripting, doc' officielle de python...

                  Par contre, je ne crois pas que ctypes soit utilisé.

                  Bonne lecture!

                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 février 2018 à 18:23:28

                    Bonsoir, 

                    désolé d'avoir été long à répondre mais j'ai eu des imprévus personnelles...

                    Je tiens tout d'abord à vous remercier pour vos réponses, et ensuite vous dire que j'ai réussi à le faire. 

                    Pour créer la librairie, j'ai utilisé l'IDE Eclipse dans lequel j'ai créer un nouveau projet "Shared Library" et j'ai importer tous les fichiers .h et .cpp nécessaire. Cela m'a donné un fichier ".so" que j'ai importé à l'aide de la librairie ctypes.

                    Pour répondre à ta question (oldProgrammer), j'en ai besoin car j'ai développé une librairie de tracking de personne dans un flux vidéo pour un projet d'école à partir de cette source : https://web.engr.oregonstate.edu/~lif/MHT_ICCV15.pdf et je souhaitais optimiser certains traitement en utilisant du code C/C++  trouvé sur le web (qui est libre de droit pour les projets d'écoles) 

                    Merci à tous pour votre participation ! 

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Ctypes utilisation de C++ dans Python

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown