2010-11-22 11 views
15

J'expérimente actuellement les fonctions python. J'ai trouvé un moyen d'importer des fonctions python dans du code c/C++, mais pas l'inverse.Importer la fonction C++ dans le programme Python

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

Pour simplifier, disons la fonction C++ est aussi simple que:

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

et le programme compilé est nommé CPROG.

Je voudrais que mon script python ê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 pourrait avoir une façon intelligente d'aller à ce sujet ...

+2

Avez-vous essayé Boost :: Python? – robbrit

+0

Non, je n'ai pas. Mais on dirait que ça pourrait faire ce que je veux. Je regarde en ce moment. Merci beaucoup! Est-ce que quelqu'un serait au courant d'une manière moins compliquée de faire ceci (sans l'utilisation d'un module de troisième roue)? – Nick

Répondre

8

Si vous construisez votre programme en tant que bibliothèque/DLL partagée, vous pouvez utiliser ctypes l'appeler.

import ctypes 
print ctypes.windll.cprog.square(4) # windows 
print ctypes.CDLL('cprog.so').square(4) # linux 
+0

J'ai oublié de ctypes, certainement le chemin à parcourir si c'est juste un couple de fonctions que vous voulez exposé. – DaedalusFall

+0

Quelle est la meilleure façon de créer un fichier * .so? Désolé, je ne suis pas un programmeur/chercheur en informatique, et ma commande g ++ correspond généralement à "g ++ Ccode.cpp -o Cfile". J'ai essayé d'utiliser -shared comme une option supplémentaire avec la ligne Linux suggérée ci-dessus et j'ai reçu une erreur. Je ne pense pas avoir créé mon fichier * .so correctement ... un conseil? – Nick

+0

@Nick: C'est une question différente, celle qui a déjà été posée: http://stackoverflow.com/questions/3588476/building-a-shared-library-using-gcc – SingleNegationElimination

3

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

  1. Utilisation de Swig - ceci lit votre code c et crée un module python à partir de celui-ci.
  2. Codé à la main en utilisant le c api python.
  3. En utilisant Boost :: Python (souvent le moyen le plus simple).

This pdf couvre 1 et 2. This page vous dira comment utiliser Boost :: Python.

Vous ne pouvez pas (facilement) utiliser une fonction qui se trouve dans un programme c/C++ - elle doit être dans une bibliothèque statique (à laquelle vous pouvez également lier votre programme c/C++).

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

+3

Voulez-vous dire Swig? –

+0

hah! Oops! en effet, je l'ai fait – DaedalusFall

0

Il existe de nombreuses façons d'encapsuler le code C++ à utiliser dans Python. La plupart sont listés sur le wiki Python here.

J'ai trouvé un moyen décemment facile d'automatiser c'est d'utiliser py++ pour générer automatiquement les wrappers, puis compiler les fichiers générés. Mais ceci est plus approprié pour les grands projets où tout emballer à la main n'est pas très faisable et causerait un cauchemar d'entretien.

+0

py ++ lien est brisé – SAAD

21

Voici un petit travail complétant l'exemple simple ci-dessus. Bien que le sujet soit ancien, je pense qu'il est utile d'avoir un guide simple pour les débutants, car j'ai aussi eu quelques problèmes auparavant.

fonction.contenu cpp (extern "C" utilisé pour que ctypes module peut gérer la fonction):

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

contenu wrapper.py:

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

compilez le fichier function.cpp (en utilisant MinGW par exemple):

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

Ensuite, créez la bibliothèque d'objets partagés avec la commande suivante (note: pas partout sont blancs):

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

Exécutez ensuite wrapper.py et le programme devrait fonctionner.

Questions connexes