web-dev-qa-db-fra.com

Envelopper du code C++ avec python (manuellement)

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:  

  1. Les fichiers principal et d'en-tête sont écrits en C++.
  2. Les fichiers principaux et les fichiers d’en-tête au lieu d’utiliser des structures de données en tant que tableaux, vecteurs, utilisent Eigen Library.

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? 

6
user7440094

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:

  • Un fichier CMakeList.txt, car vous allez utiliser CMake.
  • Les fichiers C++ du projet C++.
  • Le fichier python - ceci est votre projet python.

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:

  • Créez un répertoire avec le nom build .
  • Entrez dans ce répertoire.
  • Donner la commande 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++.
7
Onur Tuna

Voici vos options:

  1. 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.

  2. 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++.

  3. 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.

  4. 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.

2

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.

2
gps

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.

1
mucka

Vous pouvez utiliser Boost.Python

ou aller avec le Python interface native

Je recommanderais Boost.Python si vous avez déjà configuré Boost. 

0
mutantkeyboard