使用Boost.Python開發

Python本身就內置了大量功能,但畢竟不是也不可能包羅萬象,如果要實現特定擴展功能,一個辦法就是用C/C++等靜態語言在外部實現相應的功能,並按Python擴展規範打包爲一個模塊,然後在Pythonimport近來就可以使用了。

每個Python模塊都內置三個變量:__doc____name____file____name__代表模塊名,__file__代表模塊文件名,可以用print顯示出來。sys.path中存放了所有模塊加載路徑,模塊必須放在這些目錄中才能被正確import,如果要添加新的路徑調用sys.path.append()函數;執行sys.exit()可以退出程序。dir()用來查看當前已經加載的模塊,dir(模塊名)用來查看該模塊中的所有函數和成員。

現在總結我對Boost.Python開發的初步認識。

首先是編譯出一份boost_python.dll,它是boostPython模塊開發規範細節的一個封裝,通過它可以不用按Python的規範開發擴展模塊,而按照boost.python的格式開發,相對簡單多了,但運行時也多了這個動態庫依賴。首先隨便起個Win32動態庫空項目名,然後在選項中的包含文件夾添加boost庫路徑,之後添加boost\libs\python\src下的所有cpp文件到項目中,頭文件一個也不用添加。編譯前要在預處理器中加入BOOST_PYTHON_DYNAMIC_LIBBOOST_PYTHON_SOURCE的定義,最後生成DLLLIB文件。

現在可以按boost規範編寫Python擴展模塊了,首先建立一個Win32動態庫空項目,然後添加一個空cpp文件。在文件頂部先添加#include<boost/python.hpp>usingnamespaceboost::python;兩行。爲了簡單,先實現一個函數和一個類如下:

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

class World
{

public:
       
void set(std::stringmsg) { this->msg = msg;}
       std::string greet(){
return msg; }
       std::string msg;
};

然後在下面加入boost規範的Python模塊聲明:

BOOST_PYTHON_MODULE( test)
{
       class_<World> w("World");
        w.def("greet",&World::greet);
        w.def("set",&World::set);

       // 也可以這樣寫

       //class_<World> ("World")
        //.def("greet",&World::greet)
        //.def("set",&World::set);

        def("foo", foo);

}

 

編譯前要加入boost_python.lib附加依賴項,成功後得到一個dll文件必須把它改名爲test.pyd,就是必須與BOOST_PYTHON_MODULE後面括號裏的名稱一致,擴展名必須是pyd。然後把這個文件和boost_python.dll一起復制到sys.path列出的文件夾中的一個,然後啓動Python命令行模式測試:

>>>import test
>>> test.foo()
'hello, world'
>>> dir(test)
['World', '__doc__', '__file__', '__name__','foo']

>>>obj = test.World()
>>> obj.set('Hello,Python!')
>>> obj.greet()
'Hello, Python!'

也可以將腳本保存爲一個.py或.pyw文件,然後編譯爲.pyc文件,就像這樣:

>>>import compiler
>>>compiler.compileFile("*.py")

得到一個*.pyc文件,可供應用程序調用執行,比如一個簡單的程序:

#include<windows.h>
#include<Python.h>


int __stdcall WinMain( HINSTANCE hInstance, HINSTANCEhPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
       Py_Initialize();

        int i =PyRun_SimpleFile( 0, "test.pyc");

       Py_Finalize();

        return0;
}

編譯出來一個可執行文件,把test.pyc和test.pyd以及boost_python.dll都複製到同級目錄下執行即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章