python调用C/C++程序
1.可行性
python的底层大部分都是C/C++实现,python和C和C++具有天然的互相调用优势;
很多核心的算法库都是C/C++写的,在python开发过程中,经常访问别人的动态库;
所以,用python调用C/C++程序是可行的。
2.python访问C/C++的方式
- ctypes
- pybind11
- cffi
- swig
我们一般使用的是ctypes这个库
ctypes是python下的一个可以链接c/c++的一个库. 可以将C函数编译成动态链接库, 即window下的.dll文件或者是linux下的.so文件. 这样我们通过使用cytpes可以加速代码的运行速度.
3.使用ctypes的好处
- 不要修改动态库的源码
- 只需要动态库和头文件
- 使用比较简单,而且目前大部分库都是兼容C/C++
3.编写C++程序
用简单的程序说明问题
#pragma once
#include <iostream>
using namespace std;
#define TEST_EXPORT __declspec(dllexport)
#ifdef __cplusplus
extern "C"
{
#endif
TEST_EXPORT int add(int,int);
TEST_EXPORT int sub(int,int);
TEST_EXPORT int mul(int,int);
TEST_EXPORT int Div(int,int);
#ifdef __cplusplus
}
#endif
#include "testhead.h"
TEST_EXPORT int add(int a, int b)
{
return a + b;
}
TEST_EXPORT int sub(int a, int b)
{
return a - b;
}
TEST_EXPORT int mul(int a, int b)
{
return a*b;
}
TEST_EXPORT int Div(int a, int b)
{
if (b != 0)
{
return a / b;
}
else
{
cout << "error" << endl;
return -1;
}
}
然后我们需改一下项目属性,(我用的是VS2015),将配置属性->常规->目标文件扩展名,改为.dll,还有配置类型修改为动态库,然后编译就OK了。然后生成解决方案,就会产生我们需要的dll动态库了,是不是很简单。
4.编写python代码
import ctypes
lib = ctypes.cdll.LoadLibrary("C:/Users/Administrator/Desktop/test/test/Debug/test.dll")
a = 9 b = 3 value = lib.add(a, b)
print("add result:", value)
value = lib.sub(a, b)
print("sub result:", value)
print("mul result:", lib.mul(a, b))
print("div result:", lib.Div(a, b))
5.补充
5.1 C++ 使用extern “C” 的原因
ctypes是python下的一个可以链接c/c++的一个库. 可以将C函数编译成动态链接库,所以需要使用C的方式去编译。
5.2 ctypes使用方法
https://blog.csdn.net/bluehawksky/article/details/39082125
传递结构体:
https://blog.csdn.net/caobin0825/article/details/79642679、
传递指针:
https://baijiahao.baidu.com/s?id=1615259691934668555&wfr=spider&for=pc
想了解学习更多C++后台服务器方面的知识,请关注:
微信公众号:C++后台服务器开发