Puis-je utiliser des fonctionnalités C++ lors de l'extension de Python?
-
19-09-2019 - |
Question
Le Python manuel dit que vous pouvez créer des modules de Python en C et C++.Pouvez-vous profiter de choses comme des classes et des modèles lors de l'utilisation de C++?Ne serait-il pas de créer des incompatibilités avec le reste de la bibliothèques et l'interprète?
La solution
Il n'a pas d'importance si votre mise en œuvre des fonctions de raccordement est implémenté en C ou en C++.En fait, j'ai déjà vu certaines extensions Python qui utilise activement les modèles C++ et même la bibliothèque Boost. Pas de problème. :-)
Autres conseils
Les gens boost ont une belle façon automatisée pour faire l'emballage de code C ++ pour une utilisation par python.
Il est appelé: Boost.Python
Il traite de quelques-unes des constructions de C ++ mieux que SWIG, en particulier métaprogrammation modèle.
Qu'est-ce que vous êtes intéressé par un programme appelé SWIG . Il va générer wrappers Python et interfaces pour le code C ++. Je l'utilise avec des modèles, l'héritage, etc., espaces de noms et il fonctionne bien.
Vous devriez être en mesure d'utiliser toutes les fonctionnalités du langage C ++. Extension Documentation Python (2.6.2) dit que vous pouvez utiliser C ++, mais il mentionne les mises en garde de Suivis:
Il est possible d'écrire l'extension modules en C ++. certaines restrictions appliquer. Si le programme principal (Python interprète) est compilé et lié par le compilateur C, global ou statique objets avec les constructeurs ne peuvent pas être utilisé. Ce n'est pas un problème si le programme principal est relié par le C ++ compilateur. Les fonctions qui seront appelé par l'interpréteur Python (en en particulier, l'initialisation du module fonctions) doivent être déclarés à l'aide extern "C". Il est inutile de joindre les fichiers d'en-tête de Python extern "C" {...} - ils utilisent ce formulaire déjà si le symbole est __cplusplus définies (compilateurs ++ tout récent C définir ce symbole).
La première restriction, « objets globaux ou statiques avec les constructeurs ne peuvent pas être utilisés », a à voir avec la manière la plus compilateur C ++ d'initialiser des objets avec ce type de durée de stockage. Par exemple, considérez le code suivant:
class Foo { Foo() { } };
static Foo f;
int main(int argc, char** argv) {}
Le compilateur doit émettre un code spécial pour que le constructeur « Foo » s'invoqué pour « f » avant principal est exécuté. Si vous avez des objets avec une durée de stockage statique dans votre extension Python et l'interpréteur Python n'est pas compilé et lié C ++, alors ce code d'initialisation spéciale ne sera pas créé.
La deuxième restriction «fonctions qui seront appelées par l'interpréteur Python (dans, les fonctions d'initialisation du module particulier) doivent être déclarés en utilisant extern « C » », a trait à C ++ nom mangling. La plupart des compilateurs C ++ mangle leurs noms afin qu'ils puissent utiliser les mêmes linkers prévues toolchains C. Par exemple que vous avez eu:
void a_function_python_calls(void* foo);
Le compilateur C peut convertir les références au nom de « a_function_python_calls » à quelque chose comme « a_function_python_calls @ 1vga ». Dans ce cas, vous pouvez obtenir un externe non résolu en essayant de créer un lien avec la bibliothèque Python.