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

C++调用python:无参数,简单helloworld示例

2015-10-26 01:27 405 查看
运行环境:VS2015 + python3.4

总体步骤简单来说如下:

设置编译环境,其实就是设置Python的头文件和库文件目录以及一个很让人头疼的python3.4_d.lib问题

初始化Python解释器: Py_Initialize();

调用Python

释放资源 Py_Finalize();

设置编译环境

首先新建一个控制台程序

点开程序属性设置如下几个地方,对应的分别是

python头文件目录:



python库文件目录:



python34_d.lib:



这一步python26_d.lib的生成参考的是文末参考链接2,但是我在尝试的过程中一直出错,还未找到原因,下次补充。因此我采取了下下策暂时应对。首先我们看下如果没有这个文件的报错结果:



要知道这里为什么会有python34.lib和python34_d.lib的差别就是因为

python_d.lib是 库的调试后形式,当我们以debug模式编译工程时,python就用这个lib文件,但是这个文件是不可用 的。对于这点,最快的办法就是强制要求python在任何情况下都是用非调试版本,就可以了。

根据参考链接3中对python头文件pyconfig.h进行了修改:

#           if defined(_DEBUG)
#               pragma  comment(lib,"python34_d.lib")
#           elif defined(Py_LIMITED_API)
#               pragma comment(lib,"python3.lib")
#           else
#               pragma comment(lib,"python34.lib")
#           endif /* _DEBUG */


将DEBUG条件下的lib由python34_d.lib改为python34.lib.

#           if defined(_DEBUG)
#               pragma  comment(lib,"python34.lib")


所以这是下下策了,等我找到编译生成python34_d.dll和python34_d.dll出错的原因后再来补充。当然如果怕麻烦,之间用release版本就可以了,不用生成python34_d.lib。

还有一点就是我的python是64位的,因此还设置了VS的编译平台为X64。



如果没有设置,默认情况下是32位的,而我的python是64位的,会报如下错误:



都配置正确后下面是实现的代码,比较简单,就不详细说了:

python代码:

#helloworld.py
#Sherry
#2015/10/25

def HelloWorld():
print("hello, world!")


C++代码:

#include "stdafx.h"

#include <Python.h>

int main()
{
Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化
PyObject * pModule = NULL;//声明变量
PyObject * pFunc = NULL;// 声明变量
PyObject * pArg = NULL;
pModule = PyImport_ImportModule("helloworld");//这里是要调用的文件名
pFunc = PyObject_GetAttrString(pModule, "HelloWorld");//这里是要调用的函数名
PyEval_CallObject(pFunc, NULL);//调用函数
Py_Finalize();//调用Py_Finalize,这个根Py_Initialize相对应的。

system("pause");
return 0;
}


把前面写好的helloworld.py文件放在.cpp和.h所在的文件夹下,然后编译运行。

执行结果:



本文只是简单的hello world示例,没有参数的传输过程,比较简单,后面有时间了再补充有参数的情况以及使用诸如SWIG等工具进行python和C/C++相互扩展的方法。

Ref:

http://blog.csdn.net/c_cyoxi/article/details/23978007

http://blog.csdn.net/c_cyoxi/article/details/23969203

http://www.cppblog.com/API/archive/2013/04/25/199720.aspx

From:

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