Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

C++ Interface

2 views
Skip to first unread message

moerchendiser2k3

unread,
Nov 6, 2009, 6:26:49 AM11/6/09
to
Hallo,

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

Stefan Behnel

unread,
Nov 6, 2009, 7:54:17 AM11/6/09
to
Hi,

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

Mark Asbach

unread,
Nov 6, 2009, 1:48:42 PM11/6/09
to
Hallo namenloser,

> 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

moerchendiser2k3

unread,
Nov 6, 2009, 9:34:29 PM11/6/09
to
Hi, danke für eure Antworten. Also eine Bibliothek kommt leider nicht
in Frage, denn ich möchte mein Interface selber schreiben.

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 :)

Diez B. Roggisch

unread,
Nov 7, 2009, 7:49:00 AM11/7/09
to
moerchendiser2k3 schrieb:
> Hi, danke f�r eure Antworten. Also eine Bibliothek kommt leider nicht
> in Frage, denn ich m�chte mein Interface selber schreiben.

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

moerchendiser2k3

unread,
Nov 7, 2009, 9:30:26 PM11/7/09
to
Ich hatte mir nur gedacht es wäre deutlich durchdachter wenn ich die
entsprechenden Methoden aus der C-API in ein C++ konformes Format
bringe und die structs um eine Klasse Wrappe. SWIG klingt natürlich
auch interessant, mir ging es aber um die technische Umsetzung im
allgemeinen.


Danke! :)

Martin

Stefan Behnel

unread,
Nov 8, 2009, 8:11:11 AM11/8/09
to
moerchendiser2k3, 08.11.2009 03:30:
> Ich hatte mir nur gedacht es wᅵre deutlich durchdachter wenn ich die

> entsprechenden Methoden aus der C-API in ein C++ konformes Format
> bringe und die structs um eine Klasse Wrappe.

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

0 new messages