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

运行环境:VS2015 + python3.4
总体步骤简单来说如下:

  1. 设置编译环境,其实就是设置Python的头文件和库文件目录以及一个很让人头疼的python3.4_d.lib问题
  2. 初始化Python解释器: Py_Initialize();
  3. 调用Python
  4. 释放资源 Py_Finalize();

设置编译环境

首先新建一个控制台程序
点开程序属性设置如下几个地方,对应的分别是
python头文件目录:
C++调用python:无参数,简单helloworld示例_第1张图片
python库文件目录:
C++调用python:无参数,简单helloworld示例_第2张图片
python34_d.lib:
C++调用python:无参数,简单helloworld示例_第3张图片
这一步python26_d.lib的生成参考的是文末参考链接2,但是我在尝试的过程中一直出错,还未找到原因,下次补充。因此我采取了下下策暂时应对。首先我们看下如果没有这个文件的报错结果:
C++调用python:无参数,简单helloworld示例_第4张图片
要知道这里为什么会有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。
C++调用python:无参数,简单helloworld示例_第5张图片
如果没有设置,默认情况下是32位的,而我的python是64位的,会报如下错误:
C++调用python:无参数,简单helloworld示例_第6张图片

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

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所在的文件夹下,然后编译运行。
执行结果:
C++调用python:无参数,简单helloworld示例_第7张图片

本文只是简单的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

你可能感兴趣的:(C++调用python:无参数,简单helloworld示例)