Вызов интерпритатора 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
Re: Вызов интерпритатора Python из метода класса С++
От: Vladimir Prus  
Дата: 05.04.05 12:05
Оценка:
Здравствуйте, A.A.L., Вы писали:

AAL>Я пытаюсь интегрировать ActivePython 2.4. в С++.

AAL>Задача приблезительно такая: есть с++ класс, есть его объет. У класса есть метод. который по строке текста запускает интепритатор питона.
AAL>Причем в этой строке текста надо иметь возможность вызывать методы и самого этого С-шного класса

AAL> Py_Initialize();

AAL> PyObject *m = Py_InitModule("test", EmbMethods);
AAL> PyObject *c_api_object = PyCObject_FromVoidPtr((void *)this, NULL);
AAL> if (c_api_object)
AAL> {
AAL> PyModule_AddObject(m, "MyObj", c_api_object);
AAL> PyRun_SimpleString(script);
AAL> }
AAL> Py_Finalize();
...
AAL>компиляия проходит без ошибок/предупреждений, но во время исполнения имеем

AAL>[code]

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

Из документации:
A CObject is a Python data type which stores a pointer (void *). CObjects can only be created and accessed via their C API, but they can be passed around like any other Python object.

То есть, CObject невозможно использовать из Python. Более того, для решаемой задачи нет простого решения. В С++ невозможно определить
список методов объекта, чтобы экспортировать их в Python. Я бы порекомендовал Boost.Python: http://boost.org/libs/python
Re[2]: Вызов интерпритатора Python из метода класса С++
От: A.A.L. Украина  
Дата: 05.04.05 14:16
Оценка:
Здравствуйте, Vladimir Prus, Вы писали:

VP>Здравствуйте, A.A.L., Вы писали:


AAL>>Я пытаюсь интегрировать ActivePython 2.4. в С++.

AAL>>Задача приблезительно такая: есть с++ класс, есть его объет. У класса есть метод. который по строке текста запускает интепритатор питона.
AAL>>Причем в этой строке текста надо иметь возможность вызывать методы и самого этого С-шного класса

AAL>> Py_Initialize();

AAL>> PyObject *m = Py_InitModule("test", EmbMethods);
AAL>> PyObject *c_api_object = PyCObject_FromVoidPtr((void *)this, NULL);
AAL>> if (c_api_object)
AAL>> {
AAL>> PyModule_AddObject(m, "MyObj", c_api_object);
AAL>> PyRun_SimpleString(script);
AAL>> }
AAL>> Py_Finalize();
VP>...
AAL>>компиляия проходит без ошибок/предупреждений, но во время исполнения имеем

AAL>>[code]

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

VP>Из документации:

VP>A CObject is a Python data type which stores a pointer (void *). CObjects can only be created and accessed via their C API, but they can be passed around like any other Python object.

VP>То есть, CObject невозможно использовать из Python. Более того, для решаемой задачи нет простого решения. В С++ невозможно определить

VP>список методов объекта, чтобы экспортировать их в Python. Я бы порекомендовал Boost.Python: http://boost.org/libs/python

Извените Владимир, возможно вопрос ламерский, но
дело в том ,что мне надо вызывать интерпритатор питона из метода класса, так что бы он мог спокойно обращатся к другим членам класса ( как к свои "внутренним" методам).
Я не совсем представляю как это сдулать с boost (Я только начала с ним разбераться).
Если не сложно, плиз приведите хоть приблезительный алгоритм действий.
Заранее благодарна
Re[3]: Вызов интерпритатора Python из метода класса С++
От: Vladimir Prus  
Дата: 06.04.05 10:40
Оценка:
Здравствуйте, A.A.L., Вы писали:

VP>>То есть, CObject невозможно использовать из Python. Более того, для решаемой задачи нет простого решения. В С++ невозможно определить

VP>>список методов объекта, чтобы экспортировать их в Python. Я бы порекомендовал Boost.Python: http://boost.org/libs/python

AAL>Извените Владимир, возможно вопрос ламерский, но

AAL>дело в том ,что мне надо вызывать интерпритатор питона из метода класса, так что бы он мог спокойно обращатся к другим членам класса ( как к свои "внутренним" методам).
AAL>Я не совсем представляю как это сдулать с boost (Я только начала с ним разбераться).
AAL>Если не сложно, плиз приведите хоть приблезительный алгоритм действий.
AAL>Заранее благодарна

http://zigzag.cs.msu.su/~ghost/e2.cpp

Пример экспортирует класс и один его метод в Python и вызывает функцию в Python, передавая ей this как аргумент. Функция, в свою очередь,
вызывает метод переданного класса.

Под Linux пример собирается комадной:

g++ -g -I /usr/include/python2.3/ -o embedding e2.cpp -lboost_python

Вывод у меня примерно следующий:

$ ./embedding
InterfaceForPython::run(), address is 0xbffff4f7
About to call Python function
Calling C++ method from Python
InterfaceForPython::say(), address is 0xbffff4f7

Надеюсь, поможет. Если что:

http://boost.org/more/mailing_lists.htm#cplussig
Re[4]: Вызов интерпритатора Python из метода класса С++
От: A.A.L. Украина  
Дата: 06.04.05 13:48
Оценка:
Здравствуйте, Vladimir Prus, Вы писали:

VP>Здравствуйте, A.A.L., Вы писали:


VP>>>То есть, CObject невозможно использовать из Python. Более того, для решаемой задачи нет простого решения. В С++ невозможно определить

VP>>>список методов объекта, чтобы экспортировать их в Python. Я бы порекомендовал Boost.Python: http://boost.org/libs/python

AAL>>Извените Владимир, возможно вопрос ламерский, но

AAL>>дело в том ,что мне надо вызывать интерпритатор питона из метода класса, так что бы он мог спокойно обращатся к другим членам класса ( как к свои "внутренним" методам).
AAL>>Я не совсем представляю как это сдулать с boost (Я только начала с ним разбераться).
AAL>>Если не сложно, плиз приведите хоть приблезительный алгоритм действий.
AAL>>Заранее благодарна

VP> http://zigzag.cs.msu.su/~ghost/e2.cpp


VP>Пример экспортирует класс и один его метод в Python и вызывает функцию в Python, передавая ей this как аргумент. Функция, в свою очередь,

VP>вызывает метод переданного класса.

VP>Под Linux пример собирается комадной:


VP> g++ -g -I /usr/include/python2.3/ -o embedding e2.cpp -lboost_python


VP>Вывод у меня примерно следующий:


VP>$ ./embedding

VP>InterfaceForPython::run(), address is 0xbffff4f7
VP>About to call Python function
VP>Calling C++ method from Python
VP>InterfaceForPython::say(), address is 0xbffff4f7

VP>Надеюсь, поможет. Если что:


VP> http://boost.org/more/mailing_lists.htm#cplussig

Спасибо, буду разбираться.
У меня правда программа под винды, но...
Еще раз ОГРОМНОЕ СПАСИБО
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.