boost python嵌入_boost.python入門教程 ----python 嵌入c++

boost.python 中 python 嵌入c++ 部分,網上找到的中文資料似乎都有些過時了,

如 boost.python學習筆記 http://edyfox.codecarver.org/html/boost_python.html

在boost.python版本2中,提供更加簡潔易用的接口,我們可以使用從而

代替原始的PyRun_SimpleString等等python c 轉換api.

關於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

官網,中文的入門資料推薦

http://www.cppblog.com/skyscribe/archive/2009/08/09/92686.html

一共3個系列吧,他的博客上還有cmake的內容,本文的環境也將使用cmake編譯,可供參考.

對於2似乎swig就不提供支持了,swig 不僅僅支持 python調用c/c++,還支持許多其它高級語言調用c++, 但是它不支持python 嵌入c++.

下面僅僅介紹2 embedding, 事實上embedding 比 extending 簡單的多:)

本將會給出具體實例代碼以及環境配置方法.有些只是為了簡單,並不是最好的配置方案,

如cmake的使用.

環境配置

我的工作環境是ubuntu8.04,gcc4.24,cmake2.6,boost1.4,python2.6.

如果你在windows下工作就不用往下看了.

boost.python似乎還不支持python3 所以個人推薦使用python2.6,當然ubuntu8.04自帶的python2.5

也可以的.

1.python2.6 的安裝

去官網下載python2.6,解壓縮,

./configure --enable-shared;make; sudo make install

頭文件應該會默認安裝到/usr/local/include/python2.6.

注意第一步 ./configure --help可以查看幫助選項,如你想設置安裝到什么路徑,

特別注意 --enable-shared選項生成動態鏈接庫,libpython2.6.so

這個是我們下面需要的一定要有這個選項! 默認會生成到/usr/local/lib下,你直接./configure

的話則不會生成動態鏈接庫.

2. cmake  安裝

sudo apt-get insall cmake即可,也可以去官網下載安裝最新的cmake2.8

3. boost   安裝

去官網下載boost.1.4.2 解壓縮

./bootstrap.sh  --help

./bootstrap.sh --show-libraries  #會顯示你有哪些庫可以安裝

這里解釋一下,因為boost是模板庫,很多都只需要頭文件,不需要編譯安裝,但是有些庫是需要安裝的如

regex,python, 等等,你可以查看一下選擇自己需要安裝的庫.

我選擇了全部安裝,默認是全部安裝.

./bootstrap.sh --prefix=/usr/local/boost1.4

這樣會將頭文件安裝到 /usr/local/boost1.4/include

庫文件安裝到 /usr/local/boost1.4/lib

然后

./bjam install

注意不加install的話文件不會拷貝到你指定的安裝路徑的.

然后你可以設置一下環境變量,如BOOST_ROOT,BOOST_LIB

下面我實驗的時候直接寫的安裝路徑,如 /usr/local/boost1.4/include

直接用python,c 轉換api 如何實現.

看一個最簡單的例子

13c56c39ecd432219e5fe5f4d4ae5bc9.gif#includeintmain(intargc,char*argv[]){Py_Initialize();PyRun_SimpleString("from time import time,ctime\n""print 'Today is',ctime(time())\n");Py_Finalize();return0;}13c56c39ecd432219e5fe5f4d4ae5bc9.gif

假設這個程序命名為a.cc,如何編譯它呢.無外乎要能找到python的頭文件和動態鏈接庫.如下:

g++ -I /usr/local/include/python2.6 -lpython2.6 -o a a.cpp

./a

Today is Sun Nov 15 17:25:25 2009

boost.python的支持

使用boost.python需要以下步驟

#include 

調用Py_Initialize()  來開啟解釋器 並且生成  _main_ 模塊 .

使用該解釋器調用 Python C API .注意當前你一定不要最后調用Py_Finalize了結束解釋器 ,這個問題可能會在以后版本中改掉. 當然你可以在這些步驟中有其它的C++代碼.     還是直接看代碼吧,boost.python提供了3種調用python代碼的方法,

eval, exec, exec_file,

分別對應

計算表達式值,

執行python語句,

執行python 文本如a.py.

而boost::python::object的使用,使得調用python中的函數異常的簡單.

下面的代碼,演示了exec,exec_file,object的使用,基本上覆蓋了所有常見的需求.

首先寫一個簡單的python 文件 ,

simple.py

deffoo(i=4):returni+2008

寫一個C++的代碼

embedding.cc

13c56c39ecd432219e5fe5f4d4ae5bc9.gif#includeusingnamespacestd;#includeusingnamespaceboost::python;intmain(intargc,char*argv[]){Py_Initialize();objectmain_module=import("__main__");objectmain_namespace=main_module.attr("__dict__");  exec("hello = file('hello.txt', 'w')\n""hello.write('Hello world!')\n""hello.close()",       main_namespace);  exec("result = 5 ** 2", main_namespace);intfive_squared=extract(main_namespace["result"]);  cout<(sys.attr("version"));  std::cout<(foo(5));  cout<

如何編譯這個程序呢,其實就是能找的python, 以及boost.python的頭文件和庫文件.我采用了cmake,管理.

最簡單的在相同代碼路徑下,建立一個文件CMakeLists.txt,寫入以下內容,注意你可能需要根據自己的安裝路徑進行

更改.13c56c39ecd432219e5fe5f4d4ae5bc9.gifproject(Embedding) #隨便起一個工程名稱#boost.python,python頭文件路徑include_directories(/usr/local/boost1.4/include/usr/local/include/python2.6)link_directories(/usr/local/boost1.4/lib/usr/local/lib)  #boost.python,python動態鏈接庫路徑add_executable (embedding embedding.cc)  #源文件embedding.cc 生成可執行文件embeddingtarget_link_libraries(embedding libboost_python.so libpython2.6.so) #可執行文件依賴與這兩個庫13c56c39ecd432219e5fe5f4d4ae5bc9.gif

如果你配置好環境變量,或者頭文件庫在默認的查找位置,或者應用ln可能不需要這么繁瑣,但是這樣是一個可行的方案.

cmake .

make

./embedding

The five_squeared caculated by python is 25   2.6.2 (r262:71600, Nov 14 2009, 14:18:33)   [GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu4)]   Python has caculated foo as 2013

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值