Seg-Fehler bei der Verwendung von Ctypen mit Python und C ++

Ich versuche aufzustehen und mit Centypen zu laufen, um C ++ – Bibliotheken von Python 2.7 auf einem Linux-Rechner aufzurufen. Für den Moment versuche ich nur Spielzeugbeispiele. Ich habe gelesen und konnte das Beispiel in diesem Thread replizieren: Aufrufen von C / C ++ von python? . Beachten Sie, dass die C ++ – Klassenfunktionen keine Eingaben haben.

Ich versuche dieses Beispiel wie folgt zu erweitern.

Foo.cpp

#include <iostream> #include <string> using namespace std; class Foo { public: Foo(string name); void bar(void); private: string myName; }; Foo::Foo(string name) { std::cout << "Entered constructor in C++" << std::endl; myName = name; } void Foo::bar(void) { std::cout << "Hello, this is " << myName << std::endl; } extern "C" { Foo* Foo_new(string name) {return new Foo(name);} void Foo_bar(Foo* foo) {foo->bar();} } 

Der Code kompiliert sauber mit g++ -c -fPIC foo.cpp -o foo.o und dann g++ -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o

Ich benutze dann die folgende wrapper,

FooWrapper.py

 from ctypes import cdll, c_char_p lib = cdll.LoadLibrary('./libfoo.so') class Foo(object): def __init__(self,name): self.name = name self.obj = lib.Foo_new(c_char_p(name)) def bar(self): lib.Foo_bar(self.obj) 

Weil ich einen String an den Konstruktor weitergeben bin, bin ich unter dem Eindruck, dass ich es mit c_char_p . Vielleicht ist das falsch

Wenn ich den Code in Python 2.7 ausführe, bekomme ich einen Segmentierungsfehler,

 Python 2.7.2 (default, Feb 27 2012, 18:28:19) [GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import fooWrapper as f >>> foo = f.Foo('somename') Segmentation fault 

Also komme ich nie in die C ++ – Konstruktorfunktion. Ich habe das gleiche Problem, ob ich die self.name = name in der Konstruktormethode im Python-Code self.name = name .

Was mache ich falsch? Vielen Dank.

  • Wie exportiere ich std :: vector
  • Debugging Stl Container mit Mingw, Ausgabe mit Python-Skript
  • ImportError: dynamisches Modul definiert keine init-Funktion (initfizzbuzz)
  • C ++ back-end ruf die python-ebene definierte callbacks mit swig wrapper
  • Ersetzen des C ++ - STL-Ausgabe-Iterators durch einen Python-Generator
  • Ich kann beim Öffnen eines Objekts nicht __dealloc__ aufgerufen werden
  • One Solution collect form web for “Seg-Fehler bei der Verwendung von Ctypen mit Python und C ++”

    In deinem extern "C" deklarierst du Foo_new , um ein std::string Argument zu nehmen, aber für den Code, der von Python abrufbar ist, musst du es eine echte C-Funktion machen, die das Empfangen von Strings mit Zeichenzeigern beinhaltet. Vor allem, wie Sie tatsächlich c_char_p , der Dolmetscher, um Ihre Zeichenfolge zu einem c_char_p zu konvertieren (das ist, was der c_char_p Aufruf macht).

    Python ist die beste Programmiersprache der Welt.