c调用python

为了使得c#可以调用python的程序,探索了ironypython,这个是只支持python2的,因此就像换个其他的。今天看到很多关于c调用python的,在考虑c#调用c很方便,因此就决定先用c调用python.

坑点一 python要有.dev包头文件,也即是c中引用的#include<Python.h> 文件,如果在这方面报错,则需要安装这部分的,sudo apt-get install python-dev.

坑点二 依然不能很好的与python3兼容,但是python2可以很好的运行。

测试的.py代码

def add(a=1,b=1):
    print('Function of python called!')
    print('a = ',a)
    print('b = ',b)
    print('a + b = ',a+b)

c部分的调用代码,还不知道怎么将输出流截获。

#include <stdio.h>
#include <stdlib.h>
#include <Python.h>

int main(int argc,char **argv)
{
    //初始化,载入python的扩展模块
    Py_Initialize();
    //判断初始化是否成功
    if(!Py_IsInitialized())
        {
            printf("Python init failed!\n");
            return -1;
        }
    //PyRun_SimpleString 为宏,执行一段python代码
    //导入当前路径
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");

    PyObject *pName = NULL;
    PyObject *pModule = NULL;
    PyObject *pDict = NULL;
    PyObject *pFunc = NULL;
    PyObject *pArgs = NULL;

    //加载名为py_add的python脚本
    pName = PyString_FromString("py_add");
    pModule = PyImport_Import(pName);
    if(!pModule)
        {
            printf("Load py_add.py failed!\n");
            getchar();
            return -1;
        }
    pDict = PyModule_GetDict(pModule);
    if(!pDict)
        {
            printf("Can't find dict in py_add!\n");
            return -1;
        }

    pFunc = PyDict_GetItemString(pDict,"add");
    if(!pFunc || !PyCallable_Check(pFunc))
        {
            printf("Can't find function!\n");
            getchar();
            return -1;
        }
    /*
    向Python传参数是以元组(tuple)的方式传过去的,
    因此我们实际上就是构造一个合适的Python元组就
    可以了,要用到PyTuple_New,Py_BuildValue,PyTuple_SetItem等几个函数
    */
    pArgs = PyTuple_New(2);

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

    //调用python的add函数
    PyObject_CallObject(pFunc,pArgs);

    //清理python对象
    if(pName)
        {
            Py_DECREF(pName);
        }
    if(pArgs)
        {
            Py_DECREF(pArgs);
        }
    if(pModule)
        {
            Py_DECREF(pModule);
        }

    //关闭python调用
    Py_Finalize();

    return 0;

}

编译代码:

gcc -I/usr/include/python2.7/ mian.c -o main -L/usr/lib/ -lpython2.7
结果图片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值