Найти - Пользователи
Полная версия: Расширение встроенного питона с помощью Boost
Начало » Python для экспертов » Расширение встроенного питона с помощью Boost
1 2 3
pasaranax
Хочу сделать, чтобы во встроенном интерпретаторе были доступны методы, которые здесь же собираются в модуль. Это вроде как должно позволить управлять классом (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.
pasaranax
Кажется, у меня получилось сделать вот таким образом
#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__"));
}
но за литературу и комментарии буду благодарен
Андрей Светлов
Где прочитать - не знаю.
error_already_set означает, что есть питоновский exception. Посмотреть на него можно через Python C API. Например, PyErr_Print()
pasaranax
А как можно передать переменную из С++ в интерпретатор, чтобы изменение ее в интерпретаторе отражалось на ее состоянии в С++?
Андрей Светлов
class A:
int a;

class_<A>("A")
.def_readwrite("a", A::a);
pasaranax
Я не могу понять, как реализовать подобную вещь:
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
}
В общем, чтобы результат кода на питоне влиял на объект на с++ вне интерпретатора, или как-то кодом на питоне вызывались методы в контексте определеннго объекта в с++. То есть, хочу реализовать управление объектом на с++ с помощью скрипта, в котором описывается его (объекта) модель поведения.
pasaranax
вот конкретнее пример
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 это по барабану
Андрей Светлов
Что-то я не понял… У вас python и c++ - разные объекты?
pasaranax
Я еще не совсем понимаю, как это все работает, в посте #6 (я его подправил) я описал, как делаю. Я не знаю, как сделать, чтобы и там, и там был один и тот же объект.
Андрей Светлов
Так просто верните из своего модуля обертку вокруг С++ NPC. Не создавайте его заново, а найдите в вашем мире - и верните.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB