C++-virtuelle Methode in Python ableiten
Verfasst: Samstag 29. August 2009, 10:42
Hallo,
Ich steht grad vor einem größeren Problem. Ich möchte mein Programm um Scripting erweitern. Es existiert bereits eine Plugin-Infrastruktur, welche ich jetzt auf Pythonscripte ausweiten will. Dafür wollte ich (eben wie auch in C++) die vorgegebenen virtuellen Methoden implementieren.
Nur gibt es jetzt Probleme beim Aufrufen in meinem Programm :/
Ich wollte natürlich erst klein anfangen
Hier mal etwas Code:
class.h
class.cpp
testapp.py
testapp.cpp
Das Python-Modul wird mit SWIG erstellt.
Mein Problem ist, dass natürlich test() nicht via Python definiert ist, sondern eben im von SWIG generierten Modul.
Wenn ich method auf "runTest" setze, klappt das auch wunderbar. Aber eben nicht mit "test".
Kann mir vllt. jemand sagen, ob das so überhaupt geht? Und wenn ja, was es zu beachten gibt.
Vielen Dank
Franz
Ich steht grad vor einem größeren Problem. Ich möchte mein Programm um Scripting erweitern. Es existiert bereits eine Plugin-Infrastruktur, welche ich jetzt auf Pythonscripte ausweiten will. Dafür wollte ich (eben wie auch in C++) die vorgegebenen virtuellen Methoden implementieren.
Nur gibt es jetzt Probleme beim Aufrufen in meinem Programm :/
Ich wollte natürlich erst klein anfangen

Hier mal etwas Code:
class.h
Code: Alles auswählen
#ifndef MY_CLASS_H
#define MY_CLASS_H
#include <string>
class Tester
{
protected:
virtual std::string runTest() const;
public:
std::string test() const;
};
#endif // MY_CLASS_H
Code: Alles auswählen
#include "class.h"
std::string
Tester::runTest() const
{
return "Tester::test()";
}
std::string
Tester::test() const
{
return runTest();
}
Code: Alles auswählen
from Test import Tester
class PyTester(Tester):
def __init__(self):
print "init PyTester"
#Tester::__init__(self)
#def test(self):
#print "call runTest"
#return self.runTest()
def runTest(self):
print "runTest"
return "PyTester::test()"
def create():
return PyTester()
Code: Alles auswählen
#include <Python.h>
#include <string>
#include <iostream>
using namespace std;
int main()
{
Py_Initialize();
PyObject* module = PyImport_ImportModule("testapp");
PyObject* factory = PyObject_GetAttrString(module, "create");
PyObject* pytester = PyEval_CallObject(factory, 0);
char method[] = "test";
PyObject* ret = PyObject_CallMethod(pytester, method, 0);
string str = PyString_AsString(ret);
std::cout << str << std::endl;
Py_Finalize();
}
Mein Problem ist, dass natürlich test() nicht via Python definiert ist, sondern eben im von SWIG generierten Modul.
Code: Alles auswählen
class Tester(_object):
__swig_setmethods__ = {}
__setattr__ = lambda self, name, value: _swig_setattr(self, Tester, name, value)
__swig_getmethods__ = {}
__getattr__ = lambda self, name: _swig_getattr(self, Tester, name)
__repr__ = _swig_repr
def test(self): return _Test.Tester_test(self)
def __init__(self):
this = _Test.new_Tester()
try: self.this.append(this)
except: self.this = this
__swig_destroy__ = _Test.delete_Tester
__del__ = lambda self : None;
Kann mir vllt. jemand sagen, ob das so überhaupt geht? Und wenn ja, was es zu beachten gibt.
Vielen Dank
Franz