使用Boost.Python开发

来源:互联网 发布:迅捷网络fwr200 编辑:程序博客网 时间:2024/05/22 17:34

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";
}

classWorld
{

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都复制到同级目录下执行即可。
0 0
原创粉丝点击