Frage

Das Python-Handbuch sagt, dass die Sie erstellen können Module für Python in C und C++.Nutze Dinge wie Klassen und Vorlagen für die Verwendung von C++?Wäre es nicht schaffen Inkompatibilitäten mit dem rest der Bibliotheken und mit dem Dolmetscher?

War es hilfreich?

Lösung

Es spielt keine Rolle, ob Ihre Implementierung der "hook" - Funktionen ist implementiert in C oder in C++.In der Tat, ich habe schon gesehen, einige Python Erweiterungen, die zur aktiven Nutzung von C++ - templates und auch der Boost-library. Kein problem. :-)

Andere Tipps

Die Boost-Leute haben eine schöne automatisierte Möglichkeit, die Verpackung von C ++ Code für die Verwendung von Python zu tun.

Es heißt: Boost.Python

Es befasst sich mit einigen der Konstrukte von C ++ besser als SWIG, insbesondere Metaprogrammierung.

Was Sie Interesse an ist ein Programm namens SWIG . Es wird erzeugen Python-Wrapper und Schnittstellen für C ++ Code. Ich benutze es mit Vorlagen, Vererbung, Namespaces, usw. und es funktioniert gut.

Es soll möglich sein, alle Funktionen der Sprache C ++ zu verwenden. Die Erweiterung Python Dokumentation (2.6.2) sagt, dass Sie C verwenden ++, aber erwähnt die folgenden Einschränkungen:

  

Es ist möglich, Erweiterung zu schreiben   Module in C ++. einige Einschränkungen   anwenden. Wenn das Hauptprogramm (der Python   Interpreter) kompiliert und verknüpft durch   die C-Compiler, global oder statisch   Objekte mit Konstrukteuren kann nicht sein   benutzt. Dies ist kein Problem, wenn die   Hauptprogramm ist durch die C ++ verknüpft   Compiler. Funktionen, die sein wird,   durch das Python-Interpreter genannt (in   Insbesondere Modulinitialisierung   Funktionen) müssen deklariert werden, indem   extern "C". Es ist nicht notwendig,   umschließen die Python-Header-Dateien in   extern "C" {...} - sie verwenden Sie dieses Formular   bereits, wenn das Symbol __cplusplus ist   definiert (die letzten C ++ Kompilierer   definieren dieses Symbol).

Die erste Einschränkung, „global oder statische Objekte mit Konstruktoren können nicht verwendet werden“, hat mit der Art und Weise zu tun, die meist C ++ Compiler initialize Objekte mit dieser Art von Speicherdauer. Betrachten wir zum Beispiel den folgenden Code:

class Foo { Foo() { } };

static Foo f;

int main(int argc, char** argv) {}

Der Compiler hat spezielle Code zu emittieren, so dass die ‚Foo‘ Konstruktor wird für ‚f‘ aufgerufen, bevor Haupt ausgeführt wird. Wenn Sie Objekte mit statischer Speicherdauer haben in Ihrer Python-Erweiterung und das Python-Interpreter ist nicht für C ++ kompiliert und verknüpft, dann ist diese spezielle Initialisierungscode wird nicht erstellt werden.

Die zweite Einschränkung, „Funktionen, die durch die Python-Interpreter aufgerufen werden (insbesondere Modulinitialisierung Funktionen) werden müssen extern erklärt mit‚C‘“, hat mit C ++ Namen Mangeln zu tun. Die meisten C ++ Compiler mangle ihre Namen, so dass sie die gleichen Linker bereitgestellt für C Werkzeugketten verwenden können. Zum Beispiel sagen Sie hat:

void a_function_python_calls(void* foo);

die C ++ Compiler kann Hinweise auf den Namen 'a_function_python_calls' so etwas wie 'a_function_python_calls @ 1VGA' konvertieren. In diesem Fall können Sie eine nicht aufgelöste externe erhalten, wenn sie Verbindung mit der Python-Bibliothek versucht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top