您的位置:首页 > 编程语言 > C语言/C++

C++嵌入Python语言(一):环境搭建及HelloWord程序测试

2015-08-11 23:11 543 查看
学习了一段时间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。

在编写学习笔记之前,主要参考以下文章,谢谢他们对我的帮助:

/article/1744146.html
http://m.blog.csdn.net/blog/heacewalker/9750365
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: