1.在VS2008中:

1)配置头文件路径 C:\Python27\include

2)配置依赖项路径:C:\Python27\libs

3)配置依赖性:python27_d.lib(注:此处用debug,所以要把C:Python25libs下的python25.lib改成python25_d.lib)

4)注:右击项目->属性,配置属性->C/C++->预编译头,将“创建/使用预编译头”选项设为“不使用预编译头”

2.工程属性说明一下。

1)创建项目是win32 项目,项目类型是dll,创建后讲项目属性的linker(链接器)中的outputfile(输出文件)的后缀dll改成pyd,不改也可以,在编译生成dll文件之后手动将后缀改为pyd。

2)python扩展需要的头文件和链接的文件都在安装的python目录下,一般是C:\PythonXX\include和C:\PythonXX\libs这2个文件夹(XX为你安装的版本)这里需要注意的是python旧的版本都是不提供python_d.lib这个文件,所以如果将项目设置为debug的同学就需要自己去下载这个文件,不然会报错,或者直接将项目设置为release来解决这个问题。

3.环境已经搭好,剩下就是写代码,写python扩展就简洁的3个步骤。

1. 第一步写好要扩展的函数,注意python与C++之间的类型转换。

2. 第二步写好模块方法和初始化函数。

4.具体案例如下:

建立一个“动态链接库”dll工程,代码如下:

#include<Python.h> //python.h是包含python一些定义的头文件,在python的include目录下
#include <windows.h>
#pragma comment(lib,"python27.lib")
static PyObject *mb_showMsg(PyObject *self,PyObject *args);
//必须extern "C"下,这样不会在C++编译器里不会更改掉导出的函数名字,我第一次就犯了这样的错误

 


 extern "C"_declspec(dllexport)void initmb() 



 { 



   



          static PyMethodDef mbMethods[] = { 



                    {"showMsg",mb_showMsg,METH_VARARGS},{NULL,NULL,NULL} 



          }; 



          //告诉python我们的模块名叫mb, 模块包含的函数都在mbMethods字典里 



          PyObject *m = Py_InitModule("mb",mbMethods); 



 } 



   



 //第一个self参数我们用不着,具体查手册,第二个参数是python传给我们的参数,它是一个python的参数tuple 



   



 static PyObject *mb_showMsg(PyObject *self,PyObject *args) 



 { 



          //我们的showMsg函数需要的是一个字符串函数 



          const char*msg = NULL; 



   



     



          if(!PyArg_ParseTuple(args,"s",&msg)) 



                    return NULL; 



          //调用MB 



          int r = ::MessageBox(NULL, (LPCWSTR)"Hello world!", (LPCWSTR)"Caption:Form C module", MB_ICONINFORMATION | MB_OK); 



          // 此处会出现一个UNICODE问题,项目菜单->最后的属性->配置属性->常规->项目默认值->unicode改为未设置 



          //或者CString str.Format("%s",str)????具体怎么使用 



          //返回值 



          return Py_BuildValue("i",r); 



 }

5.将上面这段混杂着大量注释的代码拷贝到你的编辑器里,然后在solution configuration选用release,将编译生成mb.dll,修改后缀成mb.pyd,然后拷贝到python的DLLs目录下,打开idle(python的交互程序),写入代码:
   

     mb.showMsg("afafadsf")

可以看到弹出来一个MessageBox。