在 Linux 环境下操作,因为生成的动态链接库是在 Linux 中生成的。如果需要在 Windows 环境下使用,需要使用 Windows 环境下对应编译生成动态链接库的方法进行生成。
python 调用 C 语言程序步骤:
首先需要将编写好的 .c 文件编译为动态库文件(后缀名为 .so)
gcc 源文件.c -shared -fPIC -o 目标文件.so (-shared:生成动态链接库 -fPIC:生成的代码与位置无关)
在 python 程序中导入 ctypes 模块
在 python 中引入 c 动态库,并定义一个变量来接收动态库:a=cdll.LoadLibrary(“动态库文件路径”)
python 调用其中的函数:a.函数名()
示例程序:
// test.c 文件
void foo2(int a, int b)
{
cout<<"a="<<a<<",b="<<b<<endl;
}
# test.py 文件(如果没有 ctypes,使用 pip install ctypes 安装)
import ctypes
ll = ctypes.cdll.LoadLibrary
lib = ll("./test.so")
lib.foo2(3, 4)
# 生成动态链接库(linux 的终端中,可以使用 win10 的 Linux 子系统)
gcc test.c -shared -fPIC -o test.so
# 在 Liunx 的终端中运行示例 python 程序
python3 test.py
在 Linux 环境下操作,因为生成的动态链接库是在 Linux 中生成的。如果需要在 Windows 环境下使用,需要使用 Windows 环境下对应编译生成动态链接库的方法进行生成。
python 调用 C++ 语言程序步骤:
首先需要将编写好的 .cpp 文件编译为动态库文件(后缀名为 .so)【注意:需要对程序中的函数进行封装】
gcc 源文件.cpp -shared -fPIC -o 目标文件.so (-shared:生成动态链接库 -fPIC:生成的代码与位置无关)
在 python 程序中导入 ctypes 模块
在 python 中引入 c 动态库,并定义一个变量来接收动态库:a=cdll.LoadLibrary(“动态库文件路径”)
python 调用其中的函数:a.函数名()【注意:此处调用的函数名调用的是封装后的函数名】
示例程序:
// .cpp 文件
#include
using namespace std;
void foo2(int a, int b)
{
printf("a=%d, b=%d\n", a, b);
}
/*
编译C++,一定要加 extern "C",注意C为大写,小写无法识别
此处对C++程序中的程序进行封装,一般在函数名前加c作为被python调用的函数名
*/
extern "C"
{
void cfoo2(int a, int b)
{
foo2(a,b);
}
}
# test_c++.py 文件(如果没有 ctypes,使用 pip install ctypes 安装)
import ctypes
ll = ctypes.cdll.LoadLibrary
lib = ll("./test.so")
lib.cfoo2(3, 4) # 此处调用的是封装后的函数名
# 生成动态链接库(linux 的终端中,可以使用 win10 的 Linux 子系统)
g++ test.cpp -shared -fPIC -o test.so
# 在 Liunx 的终端中运行示例 python 程序
python3 test_c++.py