c++ 调用python程序

1.配置 VS2013

1、使用VS2013创建工程,工程名test。

2、将python安装目录下的include和libs两个文件夹,拷贝到test.sln同目录下。

3、将libs中的python27.lib重命名为python27_d.lib(这个的原因是include目录下的pyconfig.h里面的代码再debug下调用的是python27_d.lib)。否则会出现以下错误:

>LINK : fatal error LNK1104: 无法打开文件“python27_d.lib”

4、点击test项目右键,在属性->c/c++->常规项->附加包含目录中添加..\include。在属性->链接器->常规->附加库依赖中添加..\libs。在属性->链接器->输入->附加依赖项中添加python27_d.lib。

5、在属性页面将平台配置为x64,不然的话会出现以下错误:

error LNK2019: 无法解析的外部符号 __imp__Py_Initialize,该符号。

6、按照以上步骤就会将其已经配置好了。这时候就可以进行测试了。

python文件Xtest.py文件名,请不要使用test.py。因为python库中存在这个库,不然,在你找函数的时候,会找不到,报错。

c++程序

完整点的调用C++

#include <stdio.h>
#include <stdlib.h>
#include "C:/Python26/include/python.h"
#pragma comment(lib, "C:\\Python26\\libs\\python26.lib")

int main(int argc, char** argv)
{
    // 初始化Python
    //在使用Python系统前,必须使用Py_Initialize对其
    //进行初始化。它会载入Python的内建模块并添加系统路
    //径到模块搜索路径中。这个函数没有返回值,检查系统
    //是否初始化成功需要使用Py_IsInitialized。

    PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pRetVal;

    Py_Initialize();
    // 检查初始化是否成功
    if ( !Py_IsInitialized() ) 
    {
        return -1;
    }

    // 载入名为pytest的脚本(注意:不是pytest.py)
    pName = PyString_FromString("pytest");
    pModule = PyImport_Import(pName);
    if ( !pModule )
    {
        printf("can't find pytest.py");
        getchar();
        return -1;
    }
    pDict = PyModule_GetDict(pModule);
    if ( !pDict ) 
    {
        return -1;
    }

    // 找出函数名为add的函数
    pFunc = PyDict_GetItemString(pDict, "add");
    if ( !pFunc || !PyCallable_Check(pFunc) )
    {
        printf("can't find function [add]");
        getchar();
        return -1;
    }

    // 参数进栈
    pArgs = PyTuple_New(2);

    // PyObject* Py_BuildValue(char *format, ...)
    // 把C++的变量转换成一个Python对象。当需要从
    // C++传递变量到Python时,就会使用这个函数。此函数
    // 有点类似C的printf,但格式不同。常用的格式有
    // s 表示字符串,
    // i 表示整型变量,
    // f 表示浮点数,
    // O 表示一个Python对象。

    PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",3)); 
    PyTuple_SetItem(pArgs, 1, Py_BuildValue("l",4));

    // 调用Python函数
    pRetVal = PyObject_CallObject(pFunc, pArgs);
    printf("function return value : %ld\r\n", PyInt_AsLong(pRetVal));

    Py_DECREF(pName);
    Py_DECREF(pArgs);
    Py_DECREF(pModule);
    Py_DECREF(pRetVal);

    // 关闭Python
    Py_Finalize();
    return 0;
}

 

常用函数

//先定义一些变量 
char *cstr;
PyObject *pstr, *pmod, *pdict;
PyObject *pfunc, *pargs;

1. void Py_Initialize( ) 
初始化Python解释器,在C++程序中使用其它Python/C API之前,必须调用此函数,如果调用失败,将产生一个致命的错误。例: 
Py_Initialize();

2. int PyRun_SimpleString( const char *command) 
执行一段Python代码,就好象是在__main__ 函数里面执行一样。例: 
PyRun_SimpleString("from time import time,ctime\n"
"print ''Today is'',ctime(time())\n");

3. PyObject* PyImport_ImportModule( char *name) 
导入一个Python模块,参数name可以是*.py文件的文件名。相当于Python内建函数__import__()。例:
pmod = PyImport_ImportModule("mymod"); //mymod.py

4. PyObject* PyModule_GetDict( PyObject *module) 
相当于Python模块对象的__dict__ 属性,得到模块名称空间下的字典对象。例: 
pdict = PyModule_GetDict(pmod);

5. PyObject* PyRun_String( const char *str, int start, PyObject *globals, PyObject *locals) 
执行一段Python代码。 
pstr = PyRun_String("message", Py_eval_input, pdict, pdict);

6. int PyArg_Parse( PyObject *args, char *format, ...) 
解构Python数据为C的类型,这样C程序中才可以使用Python里的数据。例: 
/* convert to C and print it*/
PyArg_Parse(pstr, "s", &cstr);
printf("%s\n", cstr);

7. PyObject* PyObject_GetAttrString( PyObject *o, char *attr_name) 
返回模块对象o中的attr_name 属性或函数,相当于Python中表达式语句:o.attr_name。例: 
/* to call mymod.transform(mymod.message) */
pfunc = PyObject_GetAttrString(pmod, "transform");

8. PyObject* Py_BuildValue( char *format, ...) 
构建一个参数列表,把C类型转换为Python对象,使Python可以使用C类型数据,例: 
cstr="this is hjs''s test, to uppercase";
pargs = Py_BuildValue("(s)", cstr);

9. PyEval_CallObject(PyObject* pfunc, PyObject* pargs) 
此函数有两个参数,都指向Python对象指针,pfunc是要调用的Python 函数,通常可用PyObject_GetAttrString()获得;pargs是函数的参数列表,通常可用Py_BuildValue()构建。例: 
pstr = PyEval_CallObject(pfunc, pargs);
PyArg_Parse(pstr, "s", &cstr);
printf("%s\n", cstr);

10. void Py_Finalize( ) 
关闭Python解释器,释放解释器所占用的资源。例: 
Py_Finalize();
 

猜你喜欢

转载自blog.csdn.net/xmmdbk/article/details/82346131