• python


    1.Python脚本,名称为py_add.py

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

    2.C代码

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <Python.h>
     4 
     5 int main(int argc,char **argv){
     6     //初始化,载入python的扩展模块
     7     Py_Initialize();
     8     //判断初始化是否成功
     9     if(!Py_IsInitialized()){
    10             printf("Python init failed!
    ");
    11             return -1;
    12         }
    13     //PyRun_SimpleString 为宏,执行一段python代码
    14     //导入当前路径
    15     PyRun_SimpleString("import sys");
    16     PyRun_SimpleString("sys.path.append('./')");
    17 
    18     PyObject *pName = NULL;
    19     PyObject *pModule = NULL;
    20     PyObject *pDict = NULL;
    21     PyObject *pFunc = NULL;
    22     PyObject *pArgs = NULL;
    23 
    24     //加载名为py_add的python脚本
    25     pName = PyString_FromString("py_add");
    26     pModule = PyImport_Import(pName);
    27     if(!pModule){
    28             printf("Load py_add.py failed!
    ");
    29             getchar();
    30             return -1;
    31         }
    32     pDict = PyModule_GetDict(pModule);
    33     if(!pDict){
    34             printf("Can't find dict in py_add!
    ");
    35             return -1;
    36         }
    37     pFunc = PyDict_GetItemString(pDict,"add");
    38     if(!pFunc || !PyCallable_Check(pFunc)){
    39             printf("Can't find function!
    ");
    40             getchar();
    41             return -1;
    42         }
    43     /*
    44     向Python传参数是以元组(tuple)的方式传过去的,
    45     因此我们实际上就是构造一个合适的Python元组就
    46     可以了,要用到PyTuple_New,Py_BuildValue,PyTuple_SetItem等几个函数
    47     */
    48     pArgs = PyTuple_New(2);
    49     //  PyObject* Py_BuildValue(char *format, ...) 
    50     //  把C++的变量转换成一个Python对象。当需要从 
    51     //  C++传递变量到Python时,就会使用这个函数。此函数 
    52     //  有点类似C的printf,但格式不同。常用的格式有 
    53     //  s 表示字符串, 
    54     //  i 表示整型变量, 如Py_BuildValue("ii",123,456)
    55     //  f 表示浮点数, 
    56     //  O 表示一个Python对象
    57     PyTuple_SetItem(pArgs,0,Py_BuildValue("i",123));
    58     PyTuple_SetItem(pArgs,1,Py_BuildValue("i",321));
    59     //调用python的add函数
    60     PyObject_CallObject(pFunc,pArgs);
    61     //清理python对象
    62     if(pName){
    63         Py_DECREF(pName);
    64         }
    65     if(pArgs){
    66         Py_DECREF(pArgs);
    67         }
    68     if(pModule){
    69         Py_DECREF(pModule);
    70         }
    71     //关闭python调用
    72     Py_Finalize();
    73     return 0;
    74 }

    3,编译

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

    备注:链接Python的库需在最后,否则可能会出现以下的错误提示:

    undefined reference to 'Py_Initialize'

    4,运行结果

  • 相关阅读:
    C# Renci.SshNet SFTP--FTP 操作help
    点评js异步加载的4种方式
    C# csv 操作类
    Redis分布式缓存
    webApi FileReader
    Web API 2 authentication with JWT
    Web SQL
    jQuery图像照片剪裁插件Jcrop中文演示
    使用ajax跨域withCredentials的作用
    JavaScript 判断浏览器类型及版本
  • 原文地址:https://www.cnblogs.com/jikexianfeng/p/9173403.html
Copyright © 2020-2023  润新知