欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > Ubuntu中c语言编写扩展给Python调用

Ubuntu中c语言编写扩展给Python调用

2025/2/25 4:35:47 来源:https://blog.csdn.net/weixin_45114627/article/details/143286399  浏览:    关键词:Ubuntu中c语言编写扩展给Python调用

1、编写C语言文件如下

名字为demo2.c

#include<stdio.h>void fun(void)
{printf("hello world\n");
}
int add(int a,int b)
{printf("add");return a+b;
}
/*int main(void)
{fun();return 0;
}*/#include"Python.h"
/*
*回调函数,由注册接口注册,参数额定,其中args为python端的参数
*pyArg_ParseTuple函数将python端对象转换到c对象中
*py_BuildValue函数将C对象转换为Python对象
*/static PyObject * PyFun(PyObject* self,PyObject * args)
{fun();return (PyObject*)Py_BuildValue("z",NULL);
}static PyObject * PyAdd(PyObject* self,PyObject * args)
{int a;int b;if(!(PyArg_ParseTuple(args,"ii",&a,&b)))return (PyObject*)Py_BuildValue("z",NULL);int res=add(a,b);return (PyObject*)Py_BuildValue("i",res);
}
static PyMethodDef pyFunArr[]={{"fun",PyFun,METH_VARARGS},{"add",PyAdd,METH_VARARGS},
};void initfunmode(void)
{printf("initfun\n");Py_InitModule("funmode",pyFunArr);
}

2、编写转换文件

#!/usr/bin/env pythonfrom distutils.core import setup,Extensionmodule=Extension('funmode',sources=['demo2.c'])
setup(name='funmode',ext_modules=[module])

3、构建出扩展模块

在两者所有的文件目录中,执行以下命令来生成扩展模块

python setup.py build

4、调用

#!/usr/bin/env python
#coding:utf-8import funmode
print('--------\n')
funmode.fun()
print(funmode.add(99,25))

5、其他方案

将 C 语言代码编译为共享库

5.1、创建 C 语言代码文件

创建一个名为 example.c 的文件,内容如下:

#include <stdio.h>// 定义一个函数,用于计算两个整数的和
int add_numbers(int a, int b) {return a + b;
}
5.2、将 C 语言代码编译为共享库

为了能让 Python 调用 C 语言代码,需要把 C 语言代码编译成共享库(.so 文件)。

  1. 打开终端,进入到存放 example.c 文件的目录。
  2. 使用以下命令编译 example.c 生成共享库:
gcc -shared -o example.so example.c -fPIC

这里的命令参数含义如下:

  • -shared:表示要生成共享库。
  • -o example.so:指定输出的共享库文件名是 example.so
  • example.c:是要编译的 C 语言源文件。
  • -fPIC(Position Independent Code):生成位置无关代码,这是创建共享库所必需的。
5.3、在 Python 中调用 C 语言共享库
import ctypes# 加载C语言共享库
lib = ctypes.CDLL('./example.so')# 指定函数的参数类型和返回值类型
lib.add_numbers.argtypes = [ctypes.c_int, ctypes.c_int]
lib.add_numbers.restype = ctypes.c_int# 调用C语言函数
result = lib.add_numbers(3, 5)
print("结果:", result)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词