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都复制到同级目录下执行即可。