ich würde gerne ein C++ Interface für Python schreiben. Boost war
natürlich mein erster Gedanke, jedoch hat Boost, was Argumente angeht,
einige Limitationen die ich gerne in meinem Interface nicht haben
möchte. Boost hat aber dennoch einen Ansatz der mir Recht gut gefällt.
Nehmen wir einmal an ich registriere folgende Funktion in meiner
Bibliothek:
static PyObject *my_function(PyObject *self, PyObject *args, PyObject
*kwds)
Dann wird diese Funktion entsprechend aufgerufen sobald ich sie aus
Python heraus aufrufe. Jetzt würde ich das PyObject struct jedoch
gerne um eine Klasse wrappen, und ich suche eine Möglichkeit die Typen
(PyObject*) aus dem Fuktionskopf auszutauschen. Hat jemand eine Idee
wie ich da rangehen könnte? Einfach ersetzen geht ja schlecht.
class MyWrappedPyObject {...}
static MyWrappedPyObject *my_function(MyWrappedPyObject *self,
MyWrappedPyObject *args, MyWrappedPyObject *kwds)
Danke!!!
googler
moerchendiser2k3, 06.11.2009 12:26:
> ich wᅵrde gerne ein C++ Interface fᅵr Python schreiben.
Ein "C++ Interface" kann natᅵrlich alles sein, aber wenn ich dich nicht
gᅵnzlich missverstehe, lohnt es sich nicht, das, was du vorhast, neu zu
schreiben.
> Boost war
> natᅵrlich mein erster Gedanke, jedoch hat Boost, was Argumente angeht,
> einige Limitationen die ich gerne in meinem Interface nicht haben
> mᅵchte. Boost hat aber dennoch einen Ansatz der mir Recht gut gefᅵllt.
Ich nehme an, du hast dir noch nicht Cython angesehen?
> Nehmen wir einmal an ich registriere folgende Funktion in meiner
> Bibliothek:
>
> static PyObject *my_function(PyObject *self, PyObject *args, PyObject
> *kwds)
>
> Dann wird diese Funktion entsprechend aufgerufen sobald ich sie aus
> Python heraus aufrufe. Jetzt wᅵrde ich das PyObject struct jedoch
> gerne um eine Klasse wrappen, und ich suche eine Mᅵglichkeit die Typen
> (PyObject*) aus dem Fuktionskopf auszutauschen. Hat jemand eine Idee
> wie ich da rangehen kᅵnnte? Einfach ersetzen geht ja schlecht.
Ich weiᅵ nicht genau, was du mit "PyObject struct um eine Klasse wrappen"
meinst, aber vielleicht hilft dir ja ein Beispiel weiter.
Mᅵglicher Cython code:
# declaration of external functions:
cdef extern from "some_header.h":
int my_function(long some_arg, char* other_arg, int other_value)
# wrapper code:
cdef class MyPythonWrapper:
def my_method(self, some_arg, unicode other_arg, other_value):
encoded_arg = other_arg.encode('UTF-8')
return my_function(some_arg, encoded_arg, other_value)
Stefan
> ich w�rde gerne ein C++ Interface f�r Python schreiben.
Du willst Python aus C++ heraus aufrufen? Oder Du willst existierende
C++ Software f�r Python wrappen?
F�r letzteres empfehle ich SWIG (http://www.swig.org), ersteres ist
nicht ganz so sinnvoll (finde ich). Allerdings ist es ein �blicher Weg,
C++ Klassen (z.B. mit SWIG) zu wrappen und in den eingebetteten Python
Interpreter einzubringen.
Gru�, Mark
Ich hatte mir soetwas gedacht:
class ClassObject
{
private:
PyObject *pointer;
public:
ClassObject(PyObject* op)
{
Py_INCREF(op);
this->pointer = op;
}
[...]
};
so dass ich diese dann in meinen überladenen Methoden nutzen kann:
ClassObject* MeineFunktion(ClassObject *self, ClassObject *args,
ClassObject *keywords)
{
[...]
}
Danke euch :)
Ich habe immer noch nicht verstanden, von was du was aufrufen willst.
Aber es ist so oder so eine Menge Boilerplate-code - und dafuer rate ich
dir *dringend* ein Generator-Tool an. Ich bevorzuge SIP vor SWIG.
Diez
Danke! :)
Martin
Ich habe nicht den Eindruck, dass mit obigem Satz oder deinen bisherigen
Andeutungen irgendjemandem in dieser Newsgroup klar geworden ist, was du
eigentlich machen mᅵchtest. Aber wenn dir die bisherigen Antworten und
unbeantworteten Rᅵckfragen bereits weitergeholfen haben, um so besser.
Stefan