2009-03-02 4 views
30

J'ai implémenté une classe en C++. Je veux l'utiliser avec Python. Veuillez suggérer une méthode étape par étape et élaborer chaque étape. Somthing comme ça ...Comment puis-je utiliser la classe C++ en Python?

class Test{ 
    private: 
     int n; 
    public: 
     Test(int k){ 
      n=k; 
     } 
     void setInt(int k){ 
      n = k; 
     } 
     int getInt(){ 
      return n; 
     } 
}; 

Maintenant, en Python

>>> T1 = Test(12) 
>>> T1.getInt() 
12 
>>> T1.setInt(32) 
>>> T1.getInt() 
32 

S'il vous plaît suggest.How puis-je faire? NOTE: Je voudrais savoir comment le faire manuellement. Je ne veux pas de dépendance à une bibliothèque tierce.

+1

Juste curieux - pourquoi voulez-vous éviter les tiers? –

Répondre

23

Regardez dans Boost.Python. C'est une bibliothèque pour écrire des modules python avec C++.

Regardez également dans SWIG qui peut également gérer des modules pour d'autres langages de script. Je l'ai utilisé dans le passé pour écrire des modules pour ma classe et les utiliser dans Python. Fonctionne très bien.

Vous pouvez le faire manuellement en utilisant le Python/C API, en écrivant l'interface vous-même. C'est assez bas niveau, mais vous allez acquérir beaucoup de connaissances supplémentaires sur la façon dont Python fonctionne derrière la scène (et vous en aurez besoin quand vous utiliserez SWIG de toute façon).

+12

Ne correspond pas à l'exigence "Je ne veux aucune dépendance de bibliothèque tierce". – Constantin

+2

Vous aurez besoin de la bibliothèque python quand même. il comprend bien sûr le python/c api. –

9

ctypes est bon. Il est vraiment facile à utiliser, et il est livré en standard avec Python. Malheureusement, il ne peut parler qu'aux bibliothèques partagées (Unix) ou DLL (Windows) qui ont une interface de type C, ce qui signifie que vous ne pouvez pas directement vous connecter à un objet C++. Mais vous pouvez utiliser un système de poignée où une poignée fait référence à un objet particulier. Je pense que c'est simple, facile à comprendre, et ne nécessite pas de bibliothèques supplémentaires.

+1

Pouvez-vous préciser ce que cela signifie, "vous ne pouvez pas parler aux bibliothèques partagées ou aux DLL, ce qui signifie que vous ne pouvez pas directement vous connecter à un objet C++"? Quel serait le changement de comportement sage lors de l'utilisation des objets C++ en Python? Cela aurait-il un impact notable? Je dois éventuellement écrire une liaison à mon API C++ en Python, merci d'avance pour toute aide. –

+3

@ 2g7hgfdr8324, vous m'a mal cité. Je n'ai pas dit "vous ne pouvez pas parler aux bibliothèques partagées ou aux DLLs". J'ai dit le contraire. Oui, si vous pouvez exposer votre API C++ en tant que DLL, vous pouvez l'appeler depuis Python via ctypes. Votre interface devra être C simple, pas C++. –

Questions connexes