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);
// 也可以这样写 //class_<World> ("World")
//.def("greet",&World::greet)
}
编译前要加入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();
Py_Finalize();
return0;
}
编译出来一个可执行文件,把test.pyc和test.pyd以及boost_python.dll都复制到同级目录下执行即可。