在C/C++中调用python的简单笔记part 1

来源:互联网 发布:骨科空心钉 知乎 编辑:程序博客网 时间:2024/06/06 19:40
开发平台是Visual Studio 2013 (15我还未装呢)
首先是配置
第一是安装python2.7.x版本的
然后在VS新建C++控制台程序
然后对着项目右键,点属性,打开属性框,点C/C++->常规,找到附加包含目录,把python安装目录的include目录包含进去
然后C/C++下面的链接器->常规,附加库目录,把python的libs目录包含进去
链接器->输入,附加依赖项,输入python27.lib
最后,就是把属性页上面的配置由Debug改为Release(不改的话就会发现python的函数全写着未定义标识符)
如果在编win32程序时编译出现问题可以试着把平台改为活动(x64)

以上的就是我在错误中不断百度而得来的经验

编程序,第一:
#include"Python.h"        //python官方文档说最好不要把python的函数弄进文件夹,然后来个#include"文件夹/python.h",这会影响平台移植?
//注:内含一些简单的c文件,如stdio.h之类

然后
Py_Initialize();    //初始化,第一句

Py_Finalize();        //清理,最后一句

总之,头尾分别各自加上就行了
注Py_IsInitialized()可判断是否成功初始化

Python在C里的数据类型基本上为PyObject,用法:PyObject*(注意,是指针)

我先在外面弄个简单的python文件pytest.py
def    add(a,b):
    print a+b
    return a+b

在c代码里导入文件
PyObject* pModule = PyImport_ImportModule("pytest");
if (!pModule){
    printf("can't import the module!");
    return 0;
}
其实有很多方法导入
PyImport_ImportModule的参数是字符串
而PyImport_Import的参数是PyObject*,用之前就得先PyObject* pName = PyString_FromString("pytest");把字符串转成PyObject*类型
用哪种看个人喜好

获取函数
PyObject* pFunc = PyObject_GetAttrString(pModule, "add");
当然,也有PyObject_GetAttr,所以真的是看你想用哪一种
另外还可以
PyObject* pFuncs=PyModule_GetDict(pModule);//把所有函数扔进字典里
再用pFunc=PyDict_GetItemString(pFuncs,"add");慢慢抽出来

PyObject_CallObject(pFunc, pArgs);调用函数
pArgs是Tuple,所以要先把参数扔进Tuple里

PyObject* pArgs = PyTuple_New(2);            //新建tuple
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 1));
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 2));
一眼就知道怎么用了,注:Py_BuildValue是把c类型变为PyObject*类型,里面的i指int,f就指float了……

Py_DECREF(pModule);    //把pModule引用计数减1
因为要自己手动对引用计数进行操作
所以凡是新建的PyObject*而不是直指向某些PyObject*内的某些项的在一个引用不用时都要Py_DECREF
当引用为零时会清除
例如,一个元组引用有一个,一元组中某一项的引用有一个,只要清了元组的引用项就行了

总的来说:
#include"Python.h"

int main(){
    
    Py_Initialize();
    if (!Py_IsInitialized()){
        printf("Python can't initialize");
        return 0;
    }

    PyObject* pModule = PyImport_ImportModule("pytest");
    if (!pModule){
        printf("can't import the module!");
        return 0;
    }

    PyObject* pFunc = PyObject_GetAttrString(pModule, "add");

    PyObject* pArgs = PyTuple_New(2);
    PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 1));
    PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 2));
    
    PyObject_CallObject(pFunc, pArgs);

    Py_DECREF(pModule);

    Py_Finalize();

    return 0;
}

输出结果为3,注这里的3是python文件里print a+b的打印,如果在c中得到返回结果以及元组列表字典之类的使用就下回分解吧
0 0
原创粉丝点击