C++ 调用 Python

把%Python%\include 配置到工程项目的
Project Settings——C/C++——Category——Preprocessor——Additional include directories                                                                                                                                                                


把 %Python%libs配置到工程项目的
Project Settings——Link ——Category——Input——Additionallibrary path                                                                                                                                                                          

此时,如果VC++的Build是Release版的则没什么需要配置的了

如果是DeBug版本,则会出现一个问题:cannot open file"python25_d.lib"
                                                                        
因为python没有提供debug版的python25_d.lib文件,可以生成的,网上也有,可是没找到
此时有两种解决方法:
1.直接把%Python%libs里的python25.lib文件复制一份,改名为:python25_d.lib
2.修改%Python%\include里的pyconfig.h文件。大概在293行,把里面的python25_d.lib改为 python25.lib,这里是一个判断,也可去去掉那段判断,直接改为使用 python25.lib                                                                                                        
当然可以选择版本,Build——Configuration选择,或者在工具栏空白处点右键,选择Build工具箱,可以直观的选择。
至此所有配置工作就做完了。

然后编写python文件 helloworld.py
写一个简单的,就一个函数Hello:

引用:
#helloworld.py
def Hello():
       print"Hello, world!"
把这个文件可以放到工程文件夹里。

然后编写cpp文件 py.cpp

引用:
#include<Python.h>//前面所做的一切配置都是为了调用这个头文件和相关库
int main()
{
     Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化
     PyObject * pModule = NULL;//声明变量
     PyObject * pFunc = NULL;// 声明变量
     pModule =PyImport_ImportModule("helloworld");//这里是要调用的文件名
     pFunc= PyObject_GetAttrString(pModule, "Hello");//这里是要调用的函数名
     PyEval_CallObject(pFunc, NULL);//调用函数
     Py_Finalize();//调用Py_Finalize,这个根Py_Initialize相对应的。
     return 0;
}
                                                                                                      
至此,一个简单的Python嵌入c++的例子就完成了。
会发现在工程目录里生成了一个字节编译的文件helloworld.pyc,py.exe运行的时候,正式调用这个文件的。所以如果你要单独运行py.exe,必须和helloworld.pyc一起移动,不然运行出错。
至于如何最终合成为一个exe文件,在探索中。
其实运行一个python最简单的方式莫过于直接执行Python语句了:


PyRun_SimpleString("import sys\n""print 100+200\n");

 

 

demo:

TestPython.py

def Add(a, b):
return a+b

cpp

    Py_Initialize();// 初始化
    PyObject * pModule = NULL;
    PyObject * pFunc = NULL;
    pModule = PyImport_ImportModule("TestPython");//TestPython:Python文件名
    pFunc = PyObject_GetAttrString(pModule,"Add");//Add:Python文件中的函数名
    PyObject *pArgs = PyTuple_New(2); //函数调用的参数传递均是以元组的形式打包的,2表示参数个数
    PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 5));//0---序号i表示创建int型变量
    PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 7));//1---序号
    PyObject *pReturn = NULL;//返回值
    pReturn = PyEval_CallObject(pFunc, pArgs);//调用函数
    int result = 0;
    PyArg_Parse(pReturn, "i", &result);//i表示转换成int型变量
    Py_Finalize();// 销毁
    if (result != 0)
    {
        CString str;
        str.Format("%d", result);
        AfxMessageBox(str);
    }

posted on 2015-08-07 22:10  伊扎洛  阅读(245)  评论(0)    收藏  举报

导航