boost.python学习之----python 嵌入c++

本文介绍如何在C++中嵌入Python解释器,并通过Boost.Python库调用Python代码。文中提供了一个完整的示例,包括必要的头文件、源代码及编译指令。展示了如何初始化Python环境、执行Python表达式及脚本。
摘要由CSDN通过智能技术生成

参孝了以下文章:boost.python入门教程 ----python 嵌入c++http://www.cnblogs.com/rocketfan/archive/2009/11/15/1603400.html),文章的部分内容如下:

/***********************************************************************************************************************************************************************************

关于python与C++混合编程,事实上有两个部分

  1. extending   所谓python 程序中调用c/c++代码, 其实是先处理c++代码, 预先生成的动态链接库, 如example.so,  而在python代码中import example;即可使用c/c++的函数 .
  2. embedding c++代码中调用 python 代码.

两者都可以用 python c 转换api,解决,具体可以去python官方文档查阅,但是都比较繁琐.

对于1,extending,常用的方案是boost.python以及swig.

swig是一种胶水语言,粘合C++,PYTHON,我前面的图形显示二叉树的文章中提到的就是利用pyqt作界面,

调用c++代码使用swig生成的.so动态库.

而boost.python则直接转换,可以利用py++自动生成需要的wrapper.关于这方面的内容的入门除了boost.python官网

************************************************************************************************************************************************************************************/

根据《Boost程序完全开发指南》中的编程语言支持那章(主要介绍的是window下的环境)介绍,在ubuntu11.4,python2.7环境下实现了那个嵌入调用:

//pyinit.hpp文件内容
#define PYINIT_HPP_

#include<boost/noncopyable.hpp>
#include<boost/python.hpp>
#include<boost/assert.hpp>

class pyinit : boost::noncopyable
{
public:
 pyinit(int initsigs = 1)
 {
  BOOST_ASSERT( (0 == initsigs) || (1 == initsigs) );
  Py_InitializeEx(initsigs);
 }
 ~pyinit()
 {}

 bool isInitialized()
 {
  return Py_IsInitialized();
 }

 const char* version()
 {
  return Py_GetVersion();
 }

 static void err_print()
 {
  PyErr_Print();
 }
};

#endif /* PYINIT_HPP_ */

//main.cpp文件内容

#include "pyinit.hpp"
#include <iostream>
#include <string>


int main()
{
 pyinit pinit;
 boost::python::object i(10);

 i = i * 10;
 std::cout << boost::python::extract<int>(i) << std::endl;

 boost::python::object s("string");
 std::cout << "Python's version is: " << pinit.version() << std::endl;
 std::string str = boost::python::extract<std::string>(s*5);
 std::cout << str << std::endl;

 try
 {
  boost::python::object main_ns = boost::python::import("__main__").attr("__dict__");
  str = "for x in range(1,5):\n"
    "\tprint x";
  boost::python::exec(str.c_str(), main_ns);

  boost::python::exec_file("/home/czz/workspace/boost_python/src/test.py", main_ns);
 }
 catch(...)
 {
  pyinit::err_print();
 }

    return 0;
}

//test.py只有2句语句,如下

import random

print random.random()

如何编译才是关键?这才是关键。

主要能找到python的头文件和动态链接库,boost的动态链接库。

本人这里的环境是这样:

python的头文件:/usr/include/python2.7

python的动态链接库(也含有静态链接库):/usr/lib/python2.7/config

boost有关python的动态库路径为:/usr/lib/libboost_python-py27.so(也有静态链接库libboost_python-py27.a)

执行以下命令编译:g++ -I/usr/include/python2.7 -L/usr/lib/python2.7/config -lpython2.7 -lboost_python-py27 main.cpp

即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值