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。