学习了一段时间Python,感觉Python有的模块实用性确实很强,例如Image模块处理图片,Numpy计算矩阵运算等。最近对C++调用Python的程序挺感兴趣,在网上找了些资料及看Python的帮助文档,稍加整理了下。
一、环境搭建
我是用VC6.0与Python27测试的。当你正常安装了python后,在Windows系统下,会在System32文件夹下会多出一个.dll文件,由于本人使用的是python2.7.9,所以多出来的是python27.dll。但是这还不够,我们还需要一个python27_d.dll文件。这个文件在你的python安装目录下是不存在的,需要我们自行编译生成或者上网下载他人编译好的。在这里我偷了下懒,没有直接去编译此文件,而是通过网上查找的方法:如果你想要在debug下运行程序的话,你要把pyconfig.h(在python25/include/目录下)的大概是在283行,把pragmacomment(lib,"python25_d.lib")改成pragma comment(lib,"python25.lib"),让python都使用非debug lib。另外把python的include/libs目录分别加到vc的include/libdirectories中去。这样就可以开始调用Python的程序咯。
二、HelloWorld初体验
1)、定义一个Demo.py文件,将此文件放入VC工程对应的文件夹下,文件内容如下:
#Filename Demo.py
def Hello():
print "Hello, world!"
2)、VC6建立一个控制台程序,创建一个main.cpp文件,不要用main.c文件,测试了c文件好像不能调用下面的函数。文件内容如下:
#include <python.h> //包含头文件,在c++中嵌入python,这是必须的
#include<stdio.h>
int main()
{
Py_Initialize();
if(Py_IsInitialized())
printf("Succed\n");
PyObject *pModule =NULL;
PyObject *pFunc =NULL;
pModule =PyImport_ImportModule("Demo");
pFunc =PyObject_GetAttrString(pModule,"Hello");
PyEval_CallObject(pFunc,NULL);
Py_Finalize();
return 0;
}
第一步还是包含头文件#include <python.h>
第二步,使用python之前,要调用Py_Initialize();这个函数进行初始化,初始化Python程序需要的环境等。初始化之后要用Py_IsInitialized()测试下是否初始化成功,再继续,否则会出现异常。
第三步,声明一些Python的变量,在C++中所有的对象都是PyObject类型的,这也省事,只需记住这个PyObject类型即可。在上面程序中调用只涉及到Python程序的模块名,函数名,所有只需定义两个PyObject对象。
第四步,加载模块用到PyImport_ImportModule()函数,中间的参数值就是你要使用的Python程序文件的名字,这里不需要加上文件的后缀名。加载后最好也要判断是否为空,因为如果文件拼写错误,会使PyObject对象为空。
第五步,从你import进来的module中得到你要的函数
pFunc = PyObject_GetAttrString(pModule, "Hello");第一个参数就是第四步得到的模块名,第二个参数是函数名。
第六步,调用PyEval_CallObject来执行你的函数,第二个参数为我们要调用的函数的函数,本例子不含参数,所以设置为NULL。
第七步,调用Py_Finalize,这个根Py_Initialize相对应的。一个在最前面,一个在最后面。
oK七步完成之后,编译运行即可打印HelloWorld。
在编写学习笔记之前,主要参考以下文章,谢谢他们对我的帮助:
http://blog.csdn.net/yangdelong/article/details/4732614
http://m.blog.csdn.net/blog/heacewalker/9750365