Форум сайта python.su
Хочу сделать, чтобы во встроенном интерпретаторе были доступны методы, которые здесь же собираются в модуль. Это вроде как должно позволить управлять классом (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)");
}
Офлайн
Кажется, у меня получилось сделать вот таким образом
#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()
Офлайн
А как можно передать переменную из С++ в интерпретатор, чтобы изменение ее в интерпретаторе отражалось на ее состоянии в С++?
Офлайн
class A:
int a;
class_<A>("A")
.def_readwrite("a", A::a);
Офлайн
Я не могу понять, как реализовать подобную вещь:
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)
Офлайн
вот конкретнее пример
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)
Отредактировано (Фев. 24, 2010 00:20:47)
Офлайн
Что-то я не понял… У вас python и c++ - разные объекты?
Офлайн
Я еще не совсем понимаю, как это все работает, в посте #6 (я его подправил) я описал, как делаю. Я не знаю, как сделать, чтобы и там, и там был один и тот же объект.
Офлайн
Так просто верните из своего модуля обертку вокруг С++ NPC. Не создавайте его заново, а найдите в вашем мире - и верните.
Офлайн