Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 20, 2010 02:46:27

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширение встроенного питона с помощью Boost

Хочу сделать, чтобы во встроенном интерпретаторе были доступны методы, которые здесь же собираются в модуль. Это вроде как должно позволить управлять классом (NPC) изнутри скрипта (типа ИИ). Пробую вот так:

#include <boost/python.hpp>
using namespace boost::python;

int mul(int a, int b){
return a * b;
}

BOOST_PYTHON_MODULE(NPC){
def("mul", mul);
}

int main(int argc, char **argv) {
Py_Initialize();
initNPC();
object result = exec("import NPC\n"
"print NPC.mul(2, 3)");
}
Должно написать в консоль “6”, а пишет “terminate called after throwing an instance of ‘boost::python::error_already_set’”.
И посоветуйте что-нибудь почитать на подобие раздела “Extending Embedded Python” в доках питона, тока применительно к Boost.



Офлайн

#2 Фев. 20, 2010 02:57:40

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширение встроенного питона с помощью Boost

Кажется, у меня получилось сделать вот таким образом

#include <boost/python.hpp>
using namespace boost::python;

int mul(int a, int b){
return a * b;
}

BOOST_PYTHON_MODULE(NPC){
def("mul", mul);
}

int main(int argc, char **argv) {
Py_Initialize();
initNPC();
object npc = import("NPC");
object result = exec("print mul(2, 3)",
npc.attr("__dict__"));
}
но за литературу и комментарии буду благодарен



Офлайн

#3 Фев. 20, 2010 05:11:26

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Расширение встроенного питона с помощью Boost

Где прочитать - не знаю.
error_already_set означает, что есть питоновский exception. Посмотреть на него можно через Python C API. Например, PyErr_Print()



Офлайн

#4 Фев. 23, 2010 19:20:05

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширение встроенного питона с помощью Boost

А как можно передать переменную из С++ в интерпретатор, чтобы изменение ее в интерпретаторе отражалось на ее состоянии в С++?



Офлайн

#5 Фев. 23, 2010 21:50:07

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Расширение встроенного питона с помощью Boost

class A:
int a;

class_<A>("A")
.def_readwrite("a", A::a);



Офлайн

#6 Фев. 24, 2010 00:07:47

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширение встроенного питона с помощью Boost

Я не могу понять, как реализовать подобную вещь:

class A{
int a;
public:
void setA(int a);
void doPy();
};

BOOST_PYTHON_MODULE("module"){
class_<A>("A")
.def("setA()", &A::setA);
}

void A::doPy(){
Py_Initialize();
initmodule();
object env = import("module").attr("__dict__");
exec("a = A()"
"a.setA(10)"
"#тут выполняем как-то setA(10), после чего...",
env);
// ...this->a становится равным 10
}
В общем, чтобы результат кода на питоне влиял на объект на с++ вне интерпретатора, или как-то кодом на питоне вызывались методы в контексте определеннго объекта в с++. То есть, хочу реализовать управление объектом на с++ с помощью скрипта, в котором описывается его (объекта) модель поведения.



Отредактировано (Фев. 24, 2010 19:52:53)

Офлайн

#7 Фев. 24, 2010 00:17:05

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширение встроенного питона с помощью Boost

вот конкретнее пример

class NPC{
public:
void move(int x, int y, int z);
void runAI();
};
...
void NPC::runAI(){
...
exec("move(1,2,3)");
}

wolf = NPC();
wolf.runAI();
//и после этого волк перемещается в (1,2,3)
создать отдельный экземпляр NPC внутри скрипта у меня получилось, но с++ному NPC это по барабану



Отредактировано (Фев. 24, 2010 00:20:47)

Офлайн

#8 Фев. 24, 2010 19:07:20

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Расширение встроенного питона с помощью Boost

Что-то я не понял… У вас python и c++ - разные объекты?



Офлайн

#9 Фев. 24, 2010 19:54:44

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширение встроенного питона с помощью Boost

Я еще не совсем понимаю, как это все работает, в посте #6 (я его подправил) я описал, как делаю. Я не знаю, как сделать, чтобы и там, и там был один и тот же объект.



Офлайн

#10 Фев. 24, 2010 20:45:58

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Расширение встроенного питона с помощью Boost

Так просто верните из своего модуля обертку вокруг С++ NPC. Не создавайте его заново, а найдите в вашем мире - и верните.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version