1. 程式人生 > >Boost::Python的安裝與呼叫教程

Boost::Python的安裝與呼叫教程

Boost::Python庫是pyhon和c++相互互動的框架,可以在Python中呼叫C++的類和方法,也可以讓C++呼叫Python的類和方法。

Python自身提供了一個Python/C++ API用來實現Python和C++的互動。Boost::Python是Python/C++ API的包裝,所以用起來更簡單一些。

Python對一個動態型別的語言,C++是一個靜態型別的語言,對於Python中的變數型別,Boost.Python都有相應的類對應,他們都是boost::python::object的子類。boost::python::object 包裝了PyObject *, 通過這種方式C++可以平滑的操作Python物件。Boost.Python的主要目標既保持Python的程式設計風格同時又提供C++和Python的雙向對映。

Boost::Python庫讓C++和Python幾乎無縫結合,是Boost庫的一個功能。  用Boost::Python庫,能快速、容易地將C++輸出到Python,使得Python介面和C++介面非常像。它被設計成儘可能貼近你的C++設計。大多數情況下,你不需要修改C++類就能在Boost.Python中使用它。系統會簡單地對映你的C++類和函式到Python。Boost::Python的這種繫結,是純C++實現的,除了編輯器和編譯器你什麼別的都不需要。

具體詳情可訪問Boost主頁,及關於Boost::Python的使用教程。下面是具體的關於Boost::Python的安裝及使用示例教程。本人的機器環境為:Win7 64位,VS2015,下載的最新版本的Boost Library Version 1.68.0。

關於Boost::Python的安裝步驟:

1. 到Boost官網下載最新版本的Boost Library;

2. 開啟VS Developer Command Prompt命令列,定位到Boost解壓後的資料夾,在命令列執行booststrap.bat,將在資料夾下生  成 b2.exe及bjam.exe和project-config.jam等檔案,如下圖所示:

其中project-config.jam檔案不需要修改,保持預設即可,其內容如下:

import option ; using msvc ; option.set keep-going : false ;

而user-config.jam檔案需要手動建立這個檔案,並根據自己安裝的Python路徑新增即可,其內容如下:

# Configure specific Python version.---user for boost.python---2018.10.12--- # using python : 3.6.1  : D:/Anaconda3/Anaconda361/python.exe  : D:/Anaconda3/Anaconda361/include #directory that contains pyconfig.h  : D:/Anaconda3/Anaconda361/libs    #directory that contains python361.lib  : <toolset>msvc ;

3. 如上配置完成後,在VS Developer Command Prompt命令列執行如下命令:

b2 toolset=msvc-14.0 --with-python variant=debug runtime-debugging=on link=static --user-config=user-config.jam stage address-model=64 

如果是32位系統,去掉address-model=64即可。

如上三步完成後會生成一個stage資料夾和其它資料夾。這裡只需要stage資料夾,此是我們想要的。在這個檔案加下的lib資料夾下生成了**.lib檔案,如libboost_numpy36-vc140-mt-gd-x64-1_68.lib等。

如此便完成了Boost Library的安裝。下一步介紹Boost::Python的使用教程

1. 開啟VS建立一個工程,可以是Win32 Console Application, 或Win32 Project, 或Empty Project。然後右鍵單擊所建的工程,找到最後一個選項:Properties --> C/C++ --> General --> Additional Include Directories,加入Boost標頭檔案boost_1_68_0\boost;注意,如果直接加入路徑..\boost_1_68_0\boost可能會出錯,找不到標頭檔案的錯誤,則應該這樣新增:

../boost_1_68_0\boost\..。注意這裡../替換為你的Boost解壓路徑;然後配置生成的lib檔案路徑:Properties --> Linker --> General --> Additional Library Directories,加入boost_1_68_0\stage\lib路徑;如上在配置標頭檔案路徑和庫檔案路徑的時候,也需要如法新增Python的標頭檔案和庫檔案。

2. Properties --> Linker --> Input --> Additional Dependencies加入boost_1_68_0\stage\lib資料夾下生成的庫檔名lib**.lib。若直接加入lib**.lib,一般會出現找不到庫檔案的錯誤,所以可以把它的名字改為**.lib,即去掉開頭的lib即可。

如上兩步即完成VS與Boost::Python的配置工作,下一步看一下Boost::Python與C++介面的使用示例:

//#include<iostream>
//#include<stdio.h>
//
//#include<boost\version.hpp> //包含boost標頭檔案
//#include<boost\config.hpp>
//
//int main()
//{
//	using namespace std;
//	cout << BOOST_VERSION << endl;
//	cout << BOOST_LIB_VERSION << endl;
//	cout << BOOST_PLATFORM << endl;
//	cout << BOOST_COMPILER << endl;
//	cout << BOOST_STDLIB << endl;
//
//	system("pause");
//	return 0;
//}

#include <boost/python.hpp>
#include<iostream>
#include<stdio.h>
using namespace boost::python;
//#define BOOST_PYTHON_STATIC_LIB

char const* greet()
{
	return "hello, world";
}


BOOST_PYTHON_MODULE(boostpy03)			// Python 模組開始
{
	using namespace boost::python;		// 開啟名稱空間
	def("greet", greet);
}

如上程式碼即是利用C++編寫Python模組,一切基本上都是按照C++的語法編寫即可。這塊程式碼:

BOOST_PYTHON_MODULE(boostpy03)            // Python 模組開始 {     using namespace boost::python;        // 開啟名稱空間     def("greet", greet); }

中BOOST_PYTHON_MODULE(boostpy03) 的boostpy3即為建立的工程名字,這裡要保持一致。

為了要在Python下呼叫C++編寫的模組,需要生成dll檔案,而不是exe檔案。需要在VS下進行如下配置:

Properties --> Configuration Properties --> General --> Project Defaults --> Configuration Type改為Dynamic Library(.dll)即可,在Build Solution的時候會生成boostpy03.dll檔案。

然後將boostpy03.dll檔案拷貝到Python路徑下,如直接拷貝到Python的安裝路徑下,在該路徑下有python.exe檔案。我這裡是通過Anaconda安裝的Python3,在把boostpy03.dll檔案拷貝到Python的安裝路徑之下後,通過Anaconda Prompt開啟Python,匯入模組,執行結果如下:

PS:在編譯Boost庫時,如果採用預設則會編譯為32位的庫,利用address-model=64選項則會編譯為64位的庫。同時注意,VS標題欄中Debug --> 64方可與64位庫正確配置。注意還需要將VS的cl.exe加入到環境變數中。