Importer la fonction C++ dans le programme Python

j'expérimente les fonctions python en ce moment. J'ai trouvé un moyen d'importer des fonctions python en c/c++ code, mais pas l'inverse.

j'ai un programme c++ écrit et il a une certaine fonction. J'aimerais "importer" le programme C++ compilé dans mon script python et appeler la fonction c++.

<!-Pour simplifier, disons que la fonction c++ est aussi simple que:

int square(x)
{
  return x*x;
}

et le programme compilé s'appelle Cprog.

je voudrais mon script python pour être quelque chose comme:

import Cprog

print Cprog.square(4)

Est-ce possible? J'ai cherché sur internet en vain et j'espère que l'un de vous, les gourous, aura une façon intelligente de faire...

17
demandé sur Nick 2010-11-22 04:00:05

5 réponses

voici un petit travail d'achèvement de l'exemple simple ci-dessus. Bien que le fil soit vieux, je pense qu'il est utile d'avoir un simple guide complet pour les débutants, parce que j'ai également eu quelques problèmes avant.

fonction.contenu cpp (externe "C" Utilisé pour que le module ctypes puisse gérer la fonction):

extern "C" int square(int x)
{
  return x*x;
}

wrapper.py contenu:

import ctypes
print(ctypes.windll.library.square(4)) # windows
print(ctypes.CDLL('./library.so').square(4)) # linux or when mingw used on windows

puis compiler la fonction.fichier cpp (en utilisant mingw par exemple):

g++ -shared -c -fPIC function.cpp -o function.o

puis créer les bibliothèques d'objets partagés avec la commande suivante (note: pas partout sont vides):

g++ -shared -Wl,-soname,library.so -o library.so function.o

alors lancez le wrapper.py et le programme devrait fonctionner.

22
répondu dolby 2018-05-08 19:18:51

si vous construisez votre programme comme une bibliothèque/DLL partagée, vous pouvez utiliser des ctypes pour l'appeler.

import ctypes
print ctypes.windll.cprog.square(4) # windows
print ctypes.CDLL('cprog.so').square(4) # linux
9
répondu kichik 2010-11-22 01:10:12

Vous voulez étendre python avec un module C/C++. La documentation Python suivante est un bon endroit pour commencer à lire:http://docs.python.org/extending/extending.html

3
répondu Anthony 2010-11-22 01:10:35

Vous devez créer un module python avec cette fonction. Il existe trois façons principales:

  1. utiliser Swig-ceci lit votre code c et crée un module python à partir de celui-ci.
  2. codé à la main à l'aide de l'api python C.
  3. utiliser Boost:: Python (souvent la manière la plus facile).

pdf couvertures 1 et 2. Cette page vous dira comment utiliser Boost::Python.

Vous ne pouvez pas (facilement) utiliser une fonction qui dans un programme c/c++ - il doit être dans une bibliothèque statique (que vous pouvez également lier votre programme c/c++ contre).

modifier - Cython vaut également la peine d'être mentionné.

3
répondu DaedalusFall 2010-11-23 09:30:37

il y a beaucoup de façons d'envelopper le code C++ pour être utilisé en Python. La plupart sont listés sur le wiki de Python ici.

j'ai trouvé un moyen décemment facile de l'automatiser est d'utiliser py++ pour générer automatiquement les couvertures, puis compilez les fichiers générés. Mais cela est plus approprié pour les projets plus grands où envelopper tout à la main n'est tout simplement pas très faisable et causerait un cauchemar de maintenance.

0
répondu Jonathan Sternberg 2010-11-22 01:26:19