使用 C++ 中的方法创建实例并将其传递给 Python
Creating instance with methods in C++ and passing it to Python
我正在尝试创建 Game
的实例,将其作为变量 game
传递到 test.py 的主命名空间,然后调用 game.add(e)
运行 将实体 e
添加到 std::vector 中的 C++ 函数。但是,此代码会产生错误:
unbound method Boost.Python.function object must be called with Game instance as first argument (got Entity instance instead)
(一些上下文:我试图让 Python 创建实例,这些实例将保存在 C++ 的容器中到 运行 通过每个滴答和更新。我以为我让它工作了几周前,但我又回来了,显然它没有用——我知道,源代码控制。)
#include <vector>
class Entity{
public:
Entity(){}
Entity(float x, float y){}
};
class Game{
public:
Game();
void add(Entity* entity);
private:
std::vector<Entity*> objects_;
};
Game::Game(){
}
void Game::add(Entity* entity){
objects_.push_back(entity);
}
main.cpp:
#include <iostream>
#include <boost/python.hpp>
#include "Game.h"
#include "Entity.h"
using namespace boost::python;
BOOST_PYTHON_MODULE(sfgame){
class_<Game>("Game")
.def("add", &Game::add)
;
class_<Entity>("Entity", init<float, float>())
;
}
int main(){
PyImport_AppendInittab("sfgame", &initsfgame);
Py_Initialize();
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
import("sfgame");
Game* game = new Game();
try{
main_namespace["game"] = ptr(game);
exec_file("test.py", main_namespace);
}
catch (const boost::python::error_already_set &){
PyObject *ptype, *pvalue, *ptraceback;
PyErr_Fetch(&ptype, &pvalue, &ptraceback);
std::string error;
error = boost::python::extract<std::string>(pvalue);
std::cout << error << std::endl;
}
delete game;
system("PAUSE");
return 0;
}
test.py:
from sfgame import *
e = Entity(5,5)
game.add(e)
如果您将主命名空间中的变量名称设置为 Game
,您将收到该错误,因为它与 class 名称相同。
但是,发布的代码是正确的。您必须使用变量 Game
编译 .pyd 文件,意识到您的错误,然后将其更改为 game
并编译 C++ 文件以测试它,而无需重新编译 .pyd 文件,因此错误仍然存在。
我正在尝试创建 Game
的实例,将其作为变量 game
传递到 test.py 的主命名空间,然后调用 game.add(e)
运行 将实体 e
添加到 std::vector 中的 C++ 函数。但是,此代码会产生错误:
unbound method Boost.Python.function object must be called with Game instance as first argument (got Entity instance instead)
(一些上下文:我试图让 Python 创建实例,这些实例将保存在 C++ 的容器中到 运行 通过每个滴答和更新。我以为我让它工作了几周前,但我又回来了,显然它没有用——我知道,源代码控制。)
#include <vector>
class Entity{
public:
Entity(){}
Entity(float x, float y){}
};
class Game{
public:
Game();
void add(Entity* entity);
private:
std::vector<Entity*> objects_;
};
Game::Game(){
}
void Game::add(Entity* entity){
objects_.push_back(entity);
}
main.cpp:
#include <iostream>
#include <boost/python.hpp>
#include "Game.h"
#include "Entity.h"
using namespace boost::python;
BOOST_PYTHON_MODULE(sfgame){
class_<Game>("Game")
.def("add", &Game::add)
;
class_<Entity>("Entity", init<float, float>())
;
}
int main(){
PyImport_AppendInittab("sfgame", &initsfgame);
Py_Initialize();
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
import("sfgame");
Game* game = new Game();
try{
main_namespace["game"] = ptr(game);
exec_file("test.py", main_namespace);
}
catch (const boost::python::error_already_set &){
PyObject *ptype, *pvalue, *ptraceback;
PyErr_Fetch(&ptype, &pvalue, &ptraceback);
std::string error;
error = boost::python::extract<std::string>(pvalue);
std::cout << error << std::endl;
}
delete game;
system("PAUSE");
return 0;
}
test.py:
from sfgame import *
e = Entity(5,5)
game.add(e)
如果您将主命名空间中的变量名称设置为 Game
,您将收到该错误,因为它与 class 名称相同。
但是,发布的代码是正确的。您必须使用变量 Game
编译 .pyd 文件,意识到您的错误,然后将其更改为 game
并编译 C++ 文件以测试它,而无需重新编译 .pyd 文件,因此错误仍然存在。