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
测试工程下载

...全文
582 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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


要结贴了,回复就给分。
  • 打赏
  • 举报
回复
相关推荐
发帖
脚本语言
加入

3.7w+

社区成员

JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • ITBOB • 鲍勃
申请成为版主
帖子事件
创建了帖子
2009-09-14 07:43
社区公告

CSDN 脚本语言社区接受专栏投稿(专栏会在顶部创建专属你的栏目),投稿需满足以下要求:

  • 脚本语言技术相关;
  • 文章持续更新,保持活跃;
  • 内容清晰明了,干货为主;
  • 文章排版有序,有条有理。

本社区开通招聘专栏,发布招聘信息请联系版主,发布者需要保证招聘信息真实有效,CSDN 平台和版主不对招聘内容负责!

联系方式:私聊版主、发送邮件、QQ联系等均可: