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

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

2.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 -;
}
//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 -;
}
pDict = PyModule_GetDict(pModule);
if(!pDict){
printf("Can't find dict in py_add!\n");
return -;
}
pFunc = PyDict_GetItemString(pDict,"add");
if(!pFunc || !PyCallable_Check(pFunc)){
printf("Can't find function!\n");
getchar();
return -;
}
/*
向Python传参数是以元组(tuple)的方式传过去的,
因此我们实际上就是构造一个合适的Python元组就
可以了,要用到PyTuple_New,Py_BuildValue,PyTuple_SetItem等几个函数
*/
pArgs = PyTuple_New();
// PyObject* Py_BuildValue(char *format, ...)
// 把C++的变量转换成一个Python对象。当需要从
// C++传递变量到Python时,就会使用这个函数。此函数
// 有点类似C的printf,但格式不同。常用的格式有
// s 表示字符串,
// i 表示整型变量, 如Py_BuildValue("ii",123,456)
// f 表示浮点数,
// O 表示一个Python对象
PyTuple_SetItem(pArgs,,Py_BuildValue("i",));
PyTuple_SetItem(pArgs,,Py_BuildValue("i",));
//调用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 ;
}

3,编译

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

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

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. PostgreSQL 在Ubuntu下如何修改postgres默认密码

    Step1: 切换用户为postgres sudo su postgres Step2: 用postgres连接postgreSQL psql -U postgres Step3: 修改postgre ...

  2. 001.Ceph简介概述

    一 Ceph简介 Red Hat Ceph是一个分布式的数据对象存储,系统设计旨在性能.可靠性和可扩展性上能够提供优秀的存储服务.分布式对象存储是存储的未来,因为它们适应非结构化数据,并且客户端可以同 ...

  3. 阿里 EasyExcel 使用及避坑

    github地址:https://github.com/alibaba/easyexcel 原本在项目中使用EasyPoi读取excel,后来为了统一技术方案,改用阿里的EasyExcel.EasyE ...

  4. 其实我们可以少写点if else和switch

    前言 作为搬砖在第一线的底层工人,业务场景从来是没有做不到只有想不到的复杂. 不过他强任他强,if-else全搞定,搬就完了.但是随着业务迭代或者项目交接,自己在看自己或者别人的if代码的时候,心情就 ...

  5. MII接口简介

    Standard MII总共使用了15根线,外加2根MDIO线,如果要扩展PHY芯片,这些线除了其中两根(应该是TXCLK和RXCLK)以外都是不可共用的:而Reduce Media Independ ...

  6. 在Node.js使用Promise的方式操作Mysql(续)

    在之后的开发中,为了做一些事务开发,我把mysql的连接代码从之前的query函数中分离出来了,直接使用原生的方法进行操作,但发现还是有点问题 原因是原生的node-mysql采用了回调函数的方式,同 ...

  7. BZOJ.4199.[NOI2015]品酒大会(后缀自动机 树形DP)

    BZOJ 洛谷 后缀数组做法. 洛谷上SAM比SA慢...BZOJ SAM却能快近一倍... 只考虑求极长相同子串,即所有后缀之间的LCP. 而后缀的LCP在后缀树的LCA处.同差异这道题,在每个点处 ...

  8. (Android数据传递)Intent消息传递机制 “Intent”“数据传递”

    Intent类的继承关系:   需要注意的是,该类实现了Parcelable(用于数据传递)和Cloneable接口. Intent是一种(系统级别的)消息传递机制,可以在应用程序内使用,也可以在应用 ...

  9. 潭州课堂25班:Ph201805201 django框架 第八课 表关联对象方法add,create,remove,clear,多表查询 (课堂笔记)

    查表: 数据的插入 新建添加 删除 清空

  10. Python3从零开始爬取今日头条的新闻【二、首页热点新闻抓取】

    Python3从零开始爬取今日头条的新闻[一.开发环境搭建] Python3从零开始爬取今日头条的新闻[二.首页热点新闻抓取] Python3从零开始爬取今日头条的新闻[三.滚动到底自动加载] Pyt ...