参孝了以下文章:boost.python入门教程 ----python 嵌入c++(http://www.cnblogs.com/rocketfan/archive/2009/11/15/1603400.html),文章的部分内容如下:
/***********************************************************************************************************************************************************************************
关于python与C++混合编程,事实上有两个部分
- extending 所谓python 程序中调用c/c++代码, 其实是先处理c++代码, 预先生成的动态链接库, 如example.so, 而在python代码中import example;即可使用c/c++的函数 .
- 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
即可