Tout le monde sait que les avantages de Python sont une efficacité de développement élevée et une facilité d'utilisation, tandis que le C++ a une efficacité opérationnelle élevée. Les deux peuvent se compléter, qu'il s'agisse d'intégrer du code C++ dans un projet Python ou d'utiliser Python pour implémenter des périphériques. dans une fonction de projet C++, vous devrez peut-être que Python appelle des modules C++
Voici une liste de méthodes pour exporter du code C++ centralisé dans une interface Python. Apprenons ensemble.
Export original (apprentissage recommandé : Tutoriel vidéo Python)
L'interpréteur Python est implémenté en C, donc As tant que notre structure de données C++ peut être comprise par Python, elle peut théoriquement être appelée directement. Nous implémentons test1.cpp comme suit
#include <Python.h> int Add(int x, int y) { return x + y; } int Del(int x, int y) { return x - y; } PyObject* WrappAdd(PyObject* self, PyObject* args) { int x, y; if (!PyArg_ParseTuple(args, "ii", &x, &y)) { return NULL; } return Py_BuildValue("i", Add(x, y)); } PyObject* WrappDel(PyObject* self, PyObject* args) { int x, y; if (!PyArg_ParseTuple(args, "ii", &x, &y)) { return NULL; } return Py_BuildValue("i", Del(x, y)); } static PyMethodDef test_methods[] = { {"Add", WrappAdd, METH_VARARGS, "something"}, {"Del", WrappDel, METH_VARARGS, "something"}, {NULL, NULL} }; extern "C" void inittest1() { Py_InitModule("test1", test_methods); }
La commande de compilation est la suivante
g++ -fPIC -shared test1.cpp -I/usr/include/python2.7 -o test1.so
-fPIC : générer du code cible indépendant de la position, adapté à la connexion dynamique ;
- Chemin L : signifie rechercher des fichiers de bibliothèque dans le répertoire chemin, tel que -L signifie rechercher dans le répertoire courant ;
-Chemin I : signifie rechercher des fichiers d'en-tête dans le répertoire chemin ; -o file : spécifie le fichier de sortie en tant que fichier ;
-shared : génère un fichier de bibliothèque partagé
Exécutez l'interpréteur Python et testez comme suit
>>> import test1 >>> test1.Add(1,2) 3
Il y a quelques points à noter ici
Si le nom de la bibliothèque dynamique générée est test1, le fichier source doit avoir la fonction inittest1, et le premier paramètre de Py_InitModule doit être "test1 ", sinon le module d'import Python échouera S'il s'agit d'un fichier source cpp, la fonction inittest1 doit être modifiée avec extern "C". S'il s'agit d'un fichier source c, ce n'est pas obligatoire. La raison en est que l'interpréteur Python recherchera des fonctions telles que initxxx lors de l'importation de bibliothèques, et C et C++ encoderont différemment les symboles de fonction. C++ prendra en compte la longueur de la fonction et le type de paramètre lors de l'encodage des symboles de fonction. Plus précisément, vous pouvez passer nm test1. vérifiez les symboles de fonction, l'outil c++filt peut décoder le prototype de fonction via les symboles Pour plus d'articles techniques liés à Python, veuillez visiter la colonneTutoriel Python pour apprendre !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!