python调用C++

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.youkuaiyun.com/bluehawksky/article/details/39082125
传递结构体:
https://blog.youkuaiyun.com/caobin0825/article/details/79642679、
传递指针:
https://baijiahao.baidu.com/s?id=1615259691934668555&wfr=spider&for=pc


想了解学习更多C++后台服务器方面的知识,请关注:
微信公众号:C++后台服务器开发

Python调用C++代码可以通过多种方法实现,主要包括使用扩展模块、C/C++接口封装以及工具链辅助生成绑定代码等方式。以下是几种常见且实用的方案: ### 1. 使用 `ctypes` 调用 C 风格共享库 虽然 `ctypes` 主要用于调用 C 编写的动态链接库(如 `.so` 或 `.dll`),但可以通过将 C++ 代码编译为具有 `extern "C"` 导出符号的共享库来间接调用 C++ 函数。 ```cpp // hello.cpp #include <iostream> extern "C" { void greet() { std::cout << "Hello from C++!" << std::endl; } } ``` 编译为共享库: ```bash g++ -shared -fPIC -o libhello.so hello.cpp ``` 然后在 Python调用: ```python import ctypes lib = ctypes.CDLL('./libhello.so') lib.greet() ``` ### 2. 使用 `Boost.Python` 创建 Python 扩展 `Boost.Python` 是一个功能强大的库,允许你直接将 C++ 类和函数暴露给 Python。它需要安装 Boost 库并进行适当的配置。 ```cpp // example.cpp #include <boost/python.hpp> char const* greet() { return "Hello from C++ with Boost.Python!"; } BOOST_PYTHON_MODULE(example) { using namespace boost::python; def("greet", greet); } ``` 编译命令示例: ```bash g++ -I/usr/include/python3.8 -I/usr/local/include/boost -fPIC -shared example.cpp -o example.so -lboost_python38 -lpython3.8 ``` 然后在 Python 中导入并使用: ```python import example print(example.greet()) ``` ### 3. 使用 `pybind11` 构建轻量级绑定 `pybind11` 是一个现代、轻量级的头文件库,专为简化 C++Python 的交互而设计,推荐用于新项目。 ```cpp // main.cpp #include <pybind11/pybind11.h> int add(int i, int j) { return i + j; } PYBIND11_MODULE(example, m) { m.def("add", &add, "A function that adds two numbers"); } ``` 编译命令(确保已安装 pybind11): ```bash c++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) main.cpp -o example$(python3-config --extension-suffix) ``` Python 中使用: ```python import example print(example.add(3, 4)) # 输出 7 ``` ### 4. 使用 SWIG 自动生成绑定代码 SWIG 是一个自动包装器生成工具,支持多种语言,包括 PythonC++。适用于已有大型 C++ 项目希望快速暴露接口给 Python 的场景。 假设有一个 `example.i` 接口定义文件: ```swig %module example %{ #include "example.h" %} int add(int a, int b); ``` 对应的 `example.h` 和 `example.cpp` 实现了 `add` 函数。使用 SWIG 生成绑定代码后,再编译为 Python 模块即可调用。 --- ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值