Python 调用 C代码 实现的功能
原文链接:
http://blog.csdn.net/kuaile123/article/details/11024873
https://blog.csdn.net/kuaile123/article/details/11024873
Python 提供了 ctypes 这个包,可以使 Python 轻松调用动态链接库,从而调用c/c++程序。利用gcc编译c++文件为动态链接库dll或者so文件,再利用python来调用。只是 ctypes 是基于 libffi 实现的跨语言封装,性能上可能会比使用 C Extending 来得慢一些。
安装gcc
- 下载地址 点这里
- 双击安装,出现安装界面后,点击Next
- 我的操作系统是64位的,Architecture选项处选择x86_64
- 然后点击下一步,就能安装完成
- 选择的默认路径是 C:\Program Files\mingw-w64\x8664-6.3.0-posix-seh-rt_v5-rev1。make命令和运行库包含在C:\Program Files\mingw-w64\x8664-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin文件夹下。将这里路径放到系统的Path中。如果你更改路径了,自己做相应修改。
- 打开 cmd 或者 powershell,输入
g++ -v
查看是否按照成功。按照成功或输出安装的 gcc 版本。
编写C代码和生成动态连接库
新建一个名为 test1.cpp 的 CPP 文件
#include<iostream>
using namespace std;
void foo2(int a,int b)
{
cout<<a<<" "<<b<<endl;
}
//编译C++,一定要加extern "C",注意C为大写,小写会无法识别
extern "C"
{
void cfoo2(int a,int b)
{
foo2(a,b);
}
}
- 打开 cmd 或者 powershell。切换到 test1.cpp 所在的文件夹下。
- 执行
g++ -o test1.so -shared -fPIC test1.cpp
命令,会在该目录下生产一个名为 test1.so 的动态运行库。
其中:
- -shared:该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件;
- -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
python 调用
在同一个目录下新建一个名为 test1.py 的 python 文件
import ctypes
lib = ctypes.cdll.LoadLibrary("./test1.so")
lib.cfoo2(3, 4)
运行python文件 python test1.py。运行成功显示:
3 4
[Finished in 0.1s]