Python本身就內置了大量功能,但畢竟不是也不可能包羅萬象,如果要實現特定擴展功能,一個辦法就是用C/C++等靜態語言在外部實現相應的功能,並按Python擴展規範打包爲一個模塊,然後在Python中import近來就可以使用了。
每個Python模塊都內置三個變量:__doc__、__name__和__file__。__name__代表模塊名,__file__代表模塊文件名,可以用print顯示出來。sys.path中存放了所有模塊加載路徑,模塊必須放在這些目錄中才能被正確import,如果要添加新的路徑調用sys.path.append()函數;執行sys.exit()可以退出程序。dir()用來查看當前已經加載的模塊,dir(模塊名)用來查看該模塊中的所有函數和成員。
現在總結我對Boost.Python開發的初步認識。
首先是編譯出一份boost_python.dll,它是boost對Python模塊開發規範細節的一個封裝,通過它可以不用按Python的規範開發擴展模塊,而按照boost.python的格式開發,相對簡單多了,但運行時也多了這個動態庫依賴。首先隨便起個Win32動態庫空項目名,然後在選項中的包含文件夾添加boost庫路徑,之後添加boost\libs\python\src下的所有cpp文件到項目中,頭文件一個也不用添加。編譯前要在預處理器中加入BOOST_PYTHON_DYNAMIC_LIB和BOOST_PYTHON_SOURCE的定義,最後生成DLL和LIB文件。
現在可以按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;
}