J'ai un fichier principal (main.cpp) et un fichier d'en-tête (nodes.hpp). Le fichier principal prend N (tout entier positif) comme argument d'entrée et, en utilisant les fonctions du fichier d'en-tête, donne le résultat dit 'x & y' (les deux doubles).
Remarque:
Je dois leur écrire un wrapper python, je connais bien le python mais je n’ai jamais utilisé de wrapper.
Quelqu'un peut-il se référer ou donner des notes sur l'utilisation de python wrpper pour un tel code?
Utilisez Boost.Python. Voici mon tutoriel, précédemment sur SO Docs.
Utilisation de Boost.Python
Les choses sont faciles lorsque vous devez utiliser une bibliothèque C++ dans un projet Python. Juste vous pouvez utiliser Boost.
Tout d’abord, voici une liste des composants dont vous avez besoin:
Commençons par un petit fichier C++. Notre projet C++ a une seule méthode qui retourne une chaîne "This is the first try". Appelez-le CppProject.cpp
char const *firstMethod() {
return "This is the first try.";
}
BOOST_PYTHON_MODULE(CppProject) {
boost::python::def("getTryString", firstMethod); // boost::python is the namespace
}
Avoir un fichier CMakeLists.txt un ci-dessous:
cmake_minimum_required(VERSION 2.8.3)
FIND_PACKAGE(PythonInterp)
FIND_PACKAGE(PythonLibs)
FIND_PACKAGE(Boost COMPONENTS python)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})
PYTHON_ADD_MODULE(NativeLib CppProject)
FILE(COPY MyProject.py DESTINATION .) # See the whole tutorial to understand this line
Par cette partie du tutoriel, tout est si facile. vous pouvez importer la bibliothèque et la méthode call dans votre projet python. Appelez votre projet python MyProject.py .
import NativeLib
print (NativeLib.getTryString)
Pour exécuter votre projet, suivez les instructions ci-dessous:
cmake -DCMAKE_BUILD_TYPE=Release ..
make
python MyProject.py
. Vous devez maintenant voir la chaîne renvoyée par la méthode dans votre projet C++.Voici vos options:
Vous pouvez utiliser ctypes , et j'estime qu'il s'agit de la solution la plus propre car vous convertissez votre programme en une bibliothèque partagée pouvant être appelée par tout autre logiciel, pas seulement Python. Vous devez cependant écrire vous-même une interface en C pour votre programme.
Vous pouvez utiliser Python C-Extension , et je considère cela comme la pire des solutions, car son niveau est très bas, il est sujet à des fuites de mémoire et il prend beaucoup de temps pour implémenter une fonction et dépend de la version de Python. . En gros, il est bon de démarrer un interpréteur Python dans votre C++. Vous pouvez créer des PyObjects (qui est le bloc de construction principal de tout type Python) et les gérer dans C/C++.
Vous pouvez utiliser SWIG , où il crée automatiquement l'interface que vous devez créer avec ctypes via un fichier d'interface que vous définissez. Les gens disent que c'est très bien, mais la documentation n'est pas aussi bonne.
Vous pouvez utiliser Boost.Python , ce qui est bien, mais il a un système de construction très moche avec bjam. Si vous parvenez à contourner cela, alors c'est encore mieux que les ctypes. Je suis un gros fan, mais bjam est la raison pour laquelle je ne l'utilise pas.
Ce que je fais généralement, ce sont des types. J'y crois parce qu'il souligne le principe de la responsabilité unique . La bibliothèque a un travail distinct de l'interface (l'interface C), qui est également distinct de votre script Python qui utilise cette interface et expose la "fonctionnalité simple" à l'utilisateur.
Un autre outil pour la génération d'encapsuleurs C++ est CLIF . Publié en 2017, Google l'utilise pour la plupart des projets ces temps-ci. Nous n'autorisons plus les nouveaux wrappers SWIG à être écrits pour Python en interne.
Il est construit sur Clang pour l'analyse C++ et nécessite l'utilisation d'une API C++ moderne relativement idiomatique (sans surprise, suivant Guide de la rédaction de Google ) plutôt que de tenter de vous tirer une balle dans le pied via le support de SWIG. mal "approche.
Essayez avec la documentation officielle:
https://docs.python.org/2/extending/extending.html
ce lien vous fournira un exemple simple expliquant comment inclure un module cpp et l'utiliser à partir de l'interpréteur python. Si cela est possible, essayez avec Cython: http://cython.org/
Cython vous permettra d’écrire du code de type C, de type Python, qui sera traduit en fichier compilé au format CPP puis facilement accessible à partir du langage Python.
Vous pouvez utiliser Boost.Python
ou aller avec le Python interface native
Je recommanderais Boost.Python si vous avez déjà configuré Boost.