首页 > 编程语言 >python编程(python和c相互调用)

python编程(python和c相互调用)

时间:2022-11-23 13:00:20浏览次数:33  
标签:Py return python 编程 调用 import pModule



    通常为了扩展python的功能,我们需要将c库移植到python上面。python和c调用一般分成两种情况,一种是python调用c,这种情况最为普遍,也比较简单。另外一种就是c调用python,这种情况多出现在有回调函数的时候。


1、利用ctypes实现python调用c

    用ctypes调用c是一种比较简单的方法,比如说,有这么一个c文件,


int add(int x, int y){
return (x+y);
}

    我们首先将它编译成动态库的形式,


gcc -fPIC -shared -o libAdd.so  add.c

    有了这个动态库,我们就可以用ctypes调用它了,比如说python文件是这样的,


import ctypes
l = ctypes.CDLL("./libAdd.so");
num = l.add(3,4)

    有了一个动态库,再加上这个python文件,基本上就可以完成python对c的调用了。



2、c调用python

    这种情况多出现在回调函数上,比如说事件响应,定时器等等。一般的操作是这样的,假设有一个python文件,

def show(name): 
print "this is ",name

    为了实现c对python的调用,还需要一个c文件,

#include <Python.h> 
int main() {
Py_Initialize();
if (!Py_IsInitialized()) return -1;
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");

//import Module
PyObject* pModule = PyImport_ImportModule("hello");
if (!pModule) {
printf("Can't import Module!/n");
return -1;
}

//fetch Function
PyObject* pFunHi = PyDict_GetAttrString(pModule, "show");
PyObject_CallFunction(pFunHi, "s", "tim");
Py_DECREF(pFunHi);

//Release
Py_DECREF(pModule);
Py_Finalize();
return 0;
}

gcc process.c -I/usr/include/python2.7 -ldl -lutil -lpthread -lpython2.7 -o process


标签:Py,return,python,编程,调用,import,pModule
From: https://blog.51cto.com/feixiaoxing/5881022

相关文章

  • 21.1 动态TLS--《Windows核心编程》
    应用程序通过调用一组4个函数来使用动态TLS,这些函数实际上最经常为DLL所使用。通常情况下,如果DLL使用TLS,那么当它用DLL_PROCESS_ATTACH标志调用它的DllMain函数时......
  • 21.2 静态TLS--《Windows核心编程》
    部分笔记来自于:https://blog.csdn.net/Steven_programe_life/article/details/103358251?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baiduland......
  • wpf 子页面调用父窗口方法
     参考:http://www.360doc.com/content/17/1113/11/24811_703389993.shtml//1)子页面后台定义委托(namespace下class外)//定义委托internaldelegatevoidColorChange(o......
  • socket通信编程C++实现
    socket提供了套接字,以方便我们想读取文件一样进行网络进程间的数据通信。在网络通信中,套接字一定是成对出现的。一端的发送缓冲区对应对端的接收缓冲区。我们使用同一个文......
  • 20.3 DLL入口函数--《Windows核心编程》
    如果在执行一些与进程或者线程有关的初始化或者销毁工作的时候,需要DllMain。如果只需要创建一个包含资源的DLL,不需要这个函数。B00LWINAPIDllMain(HINSTANCEhinstDll,......
  • 20.4 延迟加载DLL--《Windows核心编程》
    延迟加载的DLL是个隐含链接的DLL,它实际上要等到你的代码试图引用DLL中包含的一个符号时才进行加载。DLL延迟加载技术的原理,就是从导入表中去掉某dll这一项,等到正式调......
  • 20.5 函数转发器/已知的DLL/DLL重定向/模块的基地址重定位--《Windows核心编程》
    一、函数转发器函数转发器是DLL的输出节(导出段)中的一个项目,用于将对一个函数的调用转至另一个DLL中的另一个函数。可以在DLL中使用函数转发器:#pragmacomment(link......
  • 西门子1200,1500,300,400PLC编程软件,西门子博途博图TIA 13 V14 V15 V16 V17安装包。
     西门子博途博图TIA13V14V15V16V17安装包,西门子1200,1500,300,400PLC编程软件,永久使用。 下载安装包......
  • 随想录(写给自己的C++编程规范)
       对于我这样一个C语言的程序员来说,编写C++的机会其实不太多。但是我还是比较喜欢写C++语言,原因主要有几个方面:(1)自己学C++语言的时间比较长了,也比较了解,如果从大一的时......
  • 18. 默认堆/创建堆--《Windows核心编程》
    Windows提供了以下三种机制来对内存进行操控虚拟内存:最适合用来管理大量对象数组或者大型数据结构内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一机器上运......