Kann ich mit C++ - Funktionen, während die Erweiterung Python?
-
19-09-2019 - |
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?
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.