Boost.Python与C++互操作的问题

力为
博客专家认证
2009-09-14 07:43:13
一、问题:

现在有一个C++类库Mythma.dll,需要Python用户也可以调用这些服务,所以需要用封装其为Python扩展模块Mythma.pyd。
现在有可执行程序PythonConsole.exe,依赖Mythma.dll模块,希望PythonConsole.exe可以调用Python脚本,所以PythonConsole.exe中需要嵌入Python解析器。

此时,PythonConsole.exe既可以直接访问Mythma.dll,又可以通过Python脚本访问Mythma.dll。关系图如下:




二、实现
1、假设Mythma.dll中的类为CHelloWorld



class MythmaAPI CHelloWorld
{
public:
CHelloWorld(void);
~CHelloWorld(void);

void SetId(int nId) { m_Id = nId;}
int GetId() const { return m_Id; }

private:
int m_Id;
};



2、用Boost.Python将C++模块封装,使得Python脚本可以调用C++的功能

如:



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

BOOST_PYTHON_MODULE(MythmaPy)
{
class_<CHelloWorld>("CHelloWorld")
.def("SetId", &CHelloWorld::SetId)
.def("GetId", &CHelloWorld::GetId)
;
}

此时,可以用Python脚本访问Mythma.dll中的类,axxscript.py文件中的内容为:


#import MythmaPy
from MythmaPy import *
world = CHelloWorld()
world.SetId(100)
print world.GetId()



3、在C++程序里内嵌Python解析器,使得C++可以调用Python脚本

建立一个控制台程序PythonConsole.exe,用来嵌入Python解析器


int main(int argc, char **argv)
{
// Initialize the interpreter
Py_Initialize();

if (python::handle_exception(exec_mythma))
{
if (PyErr_Occurred())
{
BOOST_ERROR("Python Error detected");
PyErr_Print();
}
else
{
BOOST_ERROR("A C++ exception was thrown for which "
"there was no exception translator registered.");
}
}

char ch;
std::cin >> ch;
// Boost.Python doesn't support Py_Finalize yet, so don't call it!
return boost::report_errors();
}


执行调用Python脚本的过程如下:


void exec_mythma()
{
std::cout << "exec extension module Mythma" << std::endl;

python::dict global;
python::object result = python::exec_file(
".\\axxscript.py", global, global);


python::object world = global["world"];
CHelloWorld& py = python::extract<CHelloWorld&>(world) BOOST_EXTRACT_WORKAROUND;

std::cout << py.GetId() << std::endl;

std::cout << "success!" << std::endl;
}

三、症状


通过执行PythonConsole.exe无法正常调用脚本,错误信息如下:


假如直接运行脚本,结果正确。不知各位朋友发现问题的原因没有?有什么解决方法?


四、测试环境
VS2008
Python2.5
Boost 1.38
测试工程下载

...全文
634 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
gift_lbs 2009-09-16
  • 打赏
  • 举报
回复
确实 lz的提问模版可供学习… 清晰明了…
同时学习了…
Semigod 2009-09-16
  • 打赏
  • 举报
回复
好文,为了自动封装为多种语言,你可以考虑使用SWIG,个人认为SWIG还是相当不错的。
thy38 2009-09-16
  • 打赏
  • 举报
回复
赶紧回复!!!
力为 2009-09-16
  • 打赏
  • 举报
回复
要结贴了,回复就给分。快点哦
Semigod 2009-09-15
  • 打赏
  • 举报
回复
这个问题是这里提问的好榜样,问题描述清析明确,并附了可供测试的代码。建议各位看官学习。

对于这个问题,我没有相应的测试环境,也就没有办法帮你调查。我只能找时间从理论上帮你看看能不能找出点什么线索来。
DarkChampion 2009-09-15
  • 打赏
  • 举报
回复
学习了

很少用boost
DarkChampion 2009-09-15
  • 打赏
  • 举报
回复
看一看
力为 2009-09-15
  • 打赏
  • 举报
回复
终于解决这个问题了,详见此处:http://blog.csdn.net/mythma/archive/2009/09/15/4556155.aspx


要结贴了,回复就给分。

37,722

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧