相关:

为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. idea部署运行tomcat项目方法

    在导航栏点击Add Configuration-或者(打开菜单Run->Edit Configuration) 点击+号,选择Tomcat Server ->选择Local->在Na ...

  2. 玉炜的iOS开发规范(12.14更新)

    苹果账号篇 1.新建一个新项目之后的bundle ID无论是否定没定,上架的账号如果没定,最好先写一个绝对用不上的名字,因为这个bundle ID一经确定会被绑定在当前你的苹果账号上,如果正好绑定的是 ...

  3. 如何用matlab求隐式函数的导数

    如何用matlab求隐式函数的导数 隐函数求导的例子 假设有一个圆 \(x^2+y^2=5\) , 要求在某个点上的切线的斜率. 我们可以把式\(x^2+y^2=5\)中的每一项对\(x\)求导, 可 ...

  4. python重拾第五天-常用模块学习

    本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...

  5. ubuntu 安装 github desktop

    原文: https://gist.github.com/berkorbay/6feda478a00b0432d13f1fc0a50467f1 sudo wget https://github.com/ ...

  6. 【论文阅读】GRI: General Reinforced Imitation and its Application to Vision-Based Autonomous Driving

    Column: December 30, 2021 11:01 PM Last edited time: January 10, 2022 4:45 PM Sensor/组织: 3 RGB; 曾经短暂 ...

  7. Excel好用的技巧

    http://www.360doc.com/content/18/0603/07/39124342_759238510.shtml

  8. Vue2 整理(二):核心篇(组件化开发)

    前言 上一篇连接:vue2 整理:基础篇. 组件化开发 组件概念 组件,对于学Java的人来说的话,这个词所要表达的意思再熟悉不过了. 所谓组件就是:面向对象中的抽象.封装思想:而所谓的组件化就是:把 ...

  9. Qt--共享内存监听工具

    共享内存概述 共享内存的特点: 1)共享内存是进程共享数据的一种最快的方法. 一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容. 2)使用共享内存要注意的是多个进程 ...

  10. 微服务网关Gateway使用

    为什么需要网关? Gateway网关是我们服务的守门神,所有微服务的统一入口. 网关的核心功能特性 请求路由和负载均衡 一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转 ...