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

  1. def add(a=,b=):
  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!\n");
  11. return -;
  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!\n");
  29. getchar();
  30. return -;
  31. }
  32. pDict = PyModule_GetDict(pModule);
  33. if(!pDict){
  34. printf("Can't find dict in py_add!\n");
  35. return -;
  36. }
  37. pFunc = PyDict_GetItemString(pDict,"add");
  38. if(!pFunc || !PyCallable_Check(pFunc)){
  39. printf("Can't find function!\n");
  40. getchar();
  41. return -;
  42. }
  43. /*
  44. 向Python传参数是以元组(tuple)的方式传过去的,
  45. 因此我们实际上就是构造一个合适的Python元组就
  46. 可以了,要用到PyTuple_New,Py_BuildValue,PyTuple_SetItem等几个函数
  47. */
  48. pArgs = PyTuple_New();
  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,,Py_BuildValue("i",));
  58. PyTuple_SetItem(pArgs,,Py_BuildValue("i",));
  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 ;
  74. }

3,编译

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

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

  1. undefined reference to 'Py_Initialize'

4,运行结果

python - Linux C调用Python 函数的更多相关文章

  1. linux c 调用 python

    /* *gcc -o callpy callpy.cpp -I/usr/include/python3.5 -lpython3.5m */ #include <Python.h> #inc ...

  2. Python 使用ctypes调用 C 函数

    在python中通过ctypes可以直接调用c的函数,非常简单易用 下面就一步一步解释用法吧,以Linux为例讲解. 1, 首先确定你的python支持不支持ctypes python2.7以后cty ...

  3. [Python]linux自己定义Python脚本命令

    在window下写好的程序配置到Linux上,要实现随意文件夹下的命令调用. 因为初学Linux,这里从文件传输等最主要的方法入手,记录配置的过程中遇到的各种问题. 连接远端server 这里使用pu ...

  4. python学习:调用其他函数

    vim wc.py   #!/usr/bin/python   def wordCount(s):     chars = len(s)     words = len(s.split())     ...

  5. python网络编程调用recv函数完整接收数据的三种方法

    最近在使用python进行网络编程开发一个通用的tcpclient测试小工具.在使用socket进行网络编程中,如何判定对端发送一条报文是否接收完成,是进行socket网络开发必须要考虑的一个问题.这 ...

  6. 用Python在Linux下调用新中新DKQ-A16D读卡器,读二代证数据

    1.背景 最近在研究二代证读卡器,手头上的设备是新中新DKQ-A16D,在官网(https://www.onecardok.com.cn/download)逛了一圈,发现Win下的示例,浏览器插件很多 ...

  7. python调用C函数

    python 与 c可以相互调用,在做后台服务时底层服务用C/C++编写,通过python调用C库可以极大的提高开发效率. 下面对几种调用方式举例说明 1 python通过指针传递浮点型数组给C函数 ...

  8. R 调用 python

    上一篇说了python使用 rpy2 调用 R,这里介绍R如何调用python.R的强项在于统计方面,尤其是专业的统计分析,统计检验以及作图功能十分强大,但是在通用性方面,就远不如Python了,比如 ...

  9. 通过Java调用Python脚本

    在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...

随机推荐

  1. Masquerade strikes back Gym - 101911D (数学)

    Quite often the jury of Saratov SU use the problem "Masquerade" in different practice sess ...

  2. Codeforces 1130D1 Toy Train (Simplified) (思维)【贪心】

    <题目链接> 题目大意: 有一个的环形火车站,其中有$[1,n] n$个站台,站台上能够放糖果,火车只能朝一个方向移动,如果火车在站台$i$,那么下一秒就会在$i+1$站(如果$i=n$, ...

  3. CVE-2011-0762环境搭建与EXP利用

    CVE-2011-0762 vsftpd拒绝服务漏洞 危害:通过发送特殊构造的数据包.利用漏洞使应用程序崩溃 条件:连接上vsftpd才能发包 发现时间:2011-03-01 需求:找到EXP运行发送 ...

  4. ASP.NET Core 新建线程中使用依赖注入的问题

    问题来自博问的一个提问 .net core 多线程数据保存的时候DbContext被释放 . TCPService 通过构造函数注入了 ContentService , ContentService ...

  5. 一个小demo 实用selenium 抓取淘宝搜索页面内的产品内容

    废话少说,上代码 #conding:utf-8 import re from selenium import webdriver from selenium.webdriver.common.by i ...

  6. AE文件特别大

    解决AE的输出文件太大_百度经验 在渲染队列的输出组件中把格式选项改为H.264,然后你会得到一个MP4文件. 然后最关键的一步,打开格式选项,把目标比特率和最大比特率均设10(比特率越高,视频质量越 ...

  7. python基础一 ------利用生成器生成一个可迭代对象

    #利用生成器生成一个可迭代对象#需求:生成可迭代对象,输出指定范围内的素数,利用生成器产生一个可迭代对象#生成器:本身是可迭代的,只是 yield 好比return返回,yield返回后函数冻结状态, ...

  8. Linux vi/vim命令高效助记图

    图片来源网上,如有侵权,请告知,我会删除掉,谢谢~ 常用编辑按键: 1 vi +[num] file 打开文件,并将光标置于第n行首 2 vi + file 打开文件,并将光标置于最后一行首 3 vi ...

  9. BZOJ4910 : [Sdoi2017] 苹果树

    问题等价于树形依赖背包,允许一条链每个点各免费一次. 设$f[i][j]$表示按DFS序考虑到$i$,体积为$j$的最大收益. 先放入不能免费的物品,等遍历完儿子后再放入必选的物品,那么$i$到根路径 ...

  10. python网络编程(五)

    udp广播 #coding=utf-8 import socket, sys dest = ('<broadcast>', 7788) # 创建udp套接字 s = socket.sock ...