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