Вызов интерпритатора Python из метода класса С++
От: A.A.L. Украина  
Дата: 05.04.05 09:15
Оценка:
Я пытаюсь интегрировать ActivePython 2.4. в С++.
Задача приблезительно такая: есть с++ класс, есть его объет. У класса есть метод. который по строке текста запускает интепритатор питона.
Причем в этой строке текста надо иметь возможность вызывать методы и самого этого С-шного класса



#include <Python.h>
static PyObject*
 emb_Set(PyObject *self, PyObject *args)
 {
    char *key, *value;
     if(!PyArg_ParseTuple(args, "ss", &key, &value))
        return NULL;
     // do something with the C++ class here
     // how the get the class instance pointer?
     Py_INCREF(Py_None);
    return Py_None;
 }

 static PyMethodDef EmbMethods[] = {
     {"Set", emb_Set, METH_VARARGS, "Sets the given variable."},
     {NULL, NULL, 0, NULL}
 };


//вот собственно описание класса
class MyClass  
{

public:
    int i;
   char ch50[50];

   MyClass(int x, char* y)
   {
       i=x;
       strcpy(ch50,y);
   }
   int GetI() {return i; }
   

//Метод получает строку текста Python и должен его выполнить
   void runPhitonScriptMethod(char* script)
   {
       Py_Initialize();
       PyObject *m = Py_InitModule("test", EmbMethods);
       PyObject *c_api_object = PyCObject_FromVoidPtr((void *)this, NULL);
       if (c_api_object)
       {
         PyModule_AddObject(m, "MyObj", c_api_object);
         PyRun_SimpleString(script);
       }
       Py_Finalize();
   }

};

int main( int argc, char **argv )
{
        MyClass obj(5,"Vision Master");
        obj.runPhitonScriptMethod
            (
                "import test"
               "\nprint test.MyObj.GetI()\n"
              );
        getch();
}

компиляия проходит без ошибок/предупреждений, но во время исполнения имеем

Traceback (most recent call last):
File "<string>", line 6, in ?
AttributeError: 'PyCObject' object has no attribute 'GetI'
[6597 refs]

Причем картина не меняется при попытки обращения к свойству, или когда делаешь метод виртуальным (это уже совсем на всякий случай

Что самое интересное, когда я в скрипте при помощи функции help(...) пытаюсь просмотреть содержимое моего подключенного модуля, оно абсолютно пустое



07.04.05 20:27: Перенесено модератором из 'C/C++' — WolfHound
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.