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
文件)。
- 打开终端,进入到存放
example.c
文件的目录。 - 使用以下命令编译
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)