相关:

为Python编写一个简单的C语言扩展模块

在Pybind11 出现之前为Python编写扩展模块的方法有多种,但是并没有哪种方法被认为一定比其他的好,因此也就变得在为Python编写扩展模块时就是白菜萝卜各有所爱了,用哪种方式编写扩展的都有,不过自从Pybind11出现后变成为了混合编程的解决方案的首选了。

具体参见:https://zhuanlan.zhihu.com/p/147994828

-----------------------------------------------------------------

以下操作均在Ubuntu22.04系统上,Python环境为系统原生自带的Python3.10版本。

1. 配置Python环境

由于需要安装pybind11,而pybind11需要和Python运行环境进行混编,因此需要用到Python的库文件,此时就不建议使用anaconda环境创建Python环境了,这时候我们需要有一个Python的库文件可控的Python环境,此时的需要使用的Python环境可以是系统原生自带的也可以是后期自我编译的,这里为了方便就直接使用了系统Ubuntu22.04自带的Python环境了。

安装系统自带Python的其他相关组件:

sudo apt install gcc

sudo apt install g++

sudo snap install cmake --classic

sudo apt install python3-dev

sudo apt install  python3-pip

sudo apt install python3.10-venv

为保证运行环境的沙盒特性使用python的venv来创建虚拟环境:

python3 -m venv test

激活创建好的Python环境:

source test/bin/activate

退出激活的Python环境:

deactivate

-----------------------------------------------------

为创建后的Python环境安装组件:

pip install pytest

-----------------------------------------------------

下载pybind11源码:

git clone https://github.com/pybind/pybind11

编译pybind11:

mkdir build
cd build
cmake ..
make check -j 4

编译成功:

从编译后的pybind11中进行安装:

python setup.py install

------------------------------------------------------

一个简单的pybind11例子,使用pybind11为Python编写扩展:

创建文件example.cpp

touch example.cpp

编写example.exe内容:

#include <pybind11/pybind11.h>

int add(int i, int j) {
return i + j;
} PYBIND11_MODULE(example, m) {
m.doc() = "pybind11 example plugin"; // optional module docstring m.def("add", &add, "A function that adds two numbers");
}

使用C++编译方式编译为动态链接库:

c++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) example.cpp -o example$(python3-config --extension-suffix)

使用Python调用刚才编译的C++动态库:

--------------------------------------------------------------------

上面的pybind源码编译安装的方法比较复杂,绝大部分人是没必要这么安装的,我们可以选择pip方式的安装:

pip install pybind11

---------------------------------------------------------------

pybind11源码地址:

https://github.com/pybind/pybind11

pybind11说明文档:

https://pybind11.readthedocs.io/en/latest/index.html

pybind11的官方例子:

https://github.com/pybind/python_example

使用pybind11为Python编写一个简单的C语言扩展模块的更多相关文章

  1. 为Python编写一个简单的C语言扩展模块

    最近在看pytorh方面的东西,不得不承认现在这个东西比较火,有些小好奇,下载了代码发现其中计算部分基本都是C++写的,这真是要我对这个所谓Python语音编写的框架或者说是库感觉到一丢丢的小失落,细 ...

  2. 用Python编写一个简单的Http Server

    用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...

  3. 用python实现一个简单的词云

    对于在windows(Pycharm工具)里实现一个简单的词云还是经过了几步小挫折,跟大家分享下,如果遇到类似问题可以参考: 1. 导入wordcloud包时候报错,当然很明显没有安装此包. 2. 安 ...

  4. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  5. 编写一个简单的C++程序

    编写一个简单的C++程序 每个C++程序都包含一个或多个函数(function),其中一个必须命名为main.操作系统通过调用main来运行C++程序.下面是一个非常简单的main函数,它什么也不干, ...

  6. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  7. 编写一个简单的Web Server

    编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...

  8. javascript编写一个简单的编译器(理解抽象语法树AST)

    javascript编写一个简单的编译器(理解抽象语法树AST) 编译器 是一种接收一段代码,然后把它转成一些其他一种机制.我们现在来做一个在一张纸上画出一条线,那么我们画出一条线需要定义的条件如下: ...

  9. Java入门篇(一)——如何编写一个简单的Java程序

    最近准备花费很长一段时间写一些关于Java的从入门到进阶再到项目开发的教程,希望对初学Java的朋友们有所帮助,更快的融入Java的学习之中. 主要内容包括JavaSE.JavaEE的基础知识以及如何 ...

  10. 用 Go 编写一个简单的 WebSocket 推送服务

    用 Go 编写一个简单的 WebSocket 推送服务 本文中代码可以在 github.com/alfred-zhong/wserver 获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息 ...

随机推荐

  1. Big Exponential Addition

    Big Exponential Addition 给定一非负整数n计算2^n的值,一般而言把 2 乘上 n 次,就能得到答案.然而,当n特别大时,2^n要一次次地乘2可能稍嫌太慢,面对此一巨大问题利用 ...

  2. 基于Vue+OpenSeaDragon的数字细胞阅片开发

    前端框架: vue+elementui+openseadragon 后端 .net core 5.0 数据库 mysql 目前项目效果如图 在原有的基础上新增了阅片轨迹 图像调节,绘图,截图等功能. ...

  3. Django设置、使用Cookie

    使用背景: 前端根据用户选择的模块,结合ajax实现局部刷新,进到到具体模块页面后,返回,希望保持到原来选择的模块上,这就需要保存当前选择的模块id; 尝试: 1.使用Js的设置cookie,douc ...

  4. 18-Docker资源限制

    背景 若容器使用的计算机资源不加限制,那么,可能会耗光整个计算机资源. 如代码里有bug,出现了死循环,且创建了很多线程. 在Docker中,可以使用Cgroup技术限制CPU.Block IO.RA ...

  5. 使用AWS SageMaker进行机器学习项目

    使用AWS SageMaker进行机器学习项目 本文主要介绍如何使用AWS SageMaker进行机器学习项目. 1. 题目 使用的题目为阿里天池的"工业蒸汽量预测",题目地址为: ...

  6. Linux设备模型:2、基本对象 Kobject、Kset、Ktype

    原文:http://www.wowotech.net/device_model/kobject.html 作者:wowo 发布于:2014-3-7 0:25 分类:统一设备模型 前言 Kobject是 ...

  7. Java模拟高并发测试

    线程类,设置有一个公共资源 package cn.org.chris.concurrent; import java.util.concurrent.locks.Lock; import java.u ...

  8. 全国产!全志A40i+Logos FPGA核心板(4核ARM Cortex-A7)硬件说明

    硬件资源 SOM-TLA40iF核心板板载ARM.FPGA.ROM.RAM.晶振.电源.LED等硬件资源,并通过B2B连接方式引出IO.核心板所有器件(包括B2B连接器)均采用国产工业级方案,国产化率 ...

  9. .NET 6 Entity Framework Core Db First(1) 创建模型

    项目准备 1.开发环境 vs2022  .NET6 2.创建项目 新建项目 ASP.NET Core Web API,解决方案名称:EFDBFirstDemo,项目名称:EFDBFirstDemo.A ...

  10. Docker 总体架构图解

    Docker 的总体架构 Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,模块各司其职. 下图是它的总体架构图: 1. 用户使用 Docker Client 与 Docker Daem ...