pybind11学习 | 在Python中构建编译生成pyd文件
文章目录
- 0 准备
- 1. setuptools
- 2. pybind11.setup_helpers
- 3. cppimport
- 总结
0 准备
项目文件夹结构树如下:
pybind11_setup_demo└─demo # demo包│ setup.py # 用于编译C++代码,生成C/C++ python扩展│ test.py # 用于测试生成的拓展│└─src # 源码文件夹example.cpp
example.cpp
#include <pybind11/pybind11.h>namespace py = pybind11;int square(int x) {return x * x;
}PYBIND11_MODULE(example, m) {m.def("square", &square);
}
test.py
import examplehelp(example)result = example.square(5)print(result)
1. setuptools
参考文章:pybind11—python C/C++扩展编译 - 简书 (jianshu.com)
setup.py
from setuptools import setup
from setuptools import Extensionexample_module = Extension(name = 'example', # 模块名称sources = ['src/example.cpp'], # 源码# 依赖的第三方库的头文件include_dirs = [r'D:\anaconda3\envs\pybind11\include', # Python头文件路径r'D:\anaconda3\envs\pybind11\Lib\site-packages\pybind11\include' # pybind11头文件路径])setup(ext_modules = [example_module])
打开终端,进入到setup.py
文件所在目录,运行下面命令:
python setup.py build_ext --inplace
running build_ext
building 'example' extension
creating build
creating build\temp.win-amd64-cpython-38
creating build\temp.win-amd64-cpython-38\Release
creating build\temp.win-amd64-cpython-38\Release\src
...
正在创建库 build\temp.win-amd64-cpython-38\Release\src\example.cp38-win_amd64.lib 和对象 build\temp.win-amd64-cpython-38\Release\src\example.cp38-win_amd64.exp
正在生成代码
已完成代码的生成
copying build\lib.win-amd64-cpython-38\example.cp38-win_amd64.pyd ->
测试拓展模块:
python test.py
Help on module example:NAMEexampleFUNCTIONSsquare(...) method of builtins.PyCapsule instancesquare(arg0: int) -> intFILEd:\pybind11_setup_demo\demo\example.cp38-win_amd64.pyd25
2. pybind11.setup_helpers
参考文档网址:Build systems - pybind11 documentation
这种方法和上一种方法的区别在于,后者需要安装在Python环境中pip install pybind11
。pybind11提供了setup_helpers
用于简化setuptools的构建过程(作用有点类似于pybind11提供的CMake函数pybind11_add_module
)。
setup.py
from setuptools import setup
from pybind11.setup_helpers import Pybind11Extension, build_extext_modules = [Pybind11Extension("example",["src/example.cpp"],),
]setup(cmdclass = {"build_ext": build_ext}, ext_modules = ext_modules)
同样,打开终端,进入到setup.py
文件所在目录,运行下面命令:
python setup.py build_ext --inplace
running build_ext
building 'example' extension
creating build
creating build\temp.win-amd64-cpython-38
creating build\temp.win-amd64-cpython-38\Release
creating build\temp.win-amd64-cpython-38\Release\src
...正在创建库 build\temp.win-amd64-cpython-38\Release\src\example.cp38-win_amd64.lib 和对象 build\temp.win-amd64-cpython-38\Release\src\example.cp38-win_amd64.exp
正在生成代码
已完成代码的生成
copying build\lib.win-amd64-cpython-38\example.cp38-win_amd64.pyd ->
测试拓展模块:
python test.py
Help on module example:NAMEexampleFUNCTIONSsquare(...) method of builtins.PyCapsule instancesquare(arg0: int) -> intFILEd:\pybind11_setup_demo\demo\example.cp38-win_amd64.pyd25
效果和第一种没有差别,但在setup.py
文件的编写上更加方便。
3. cppimport
参考网址:tbenthompson/cppimport: Import C++ files directly from Python! (github.com)
这种方法更加简单,甚至不需要编写setup.py
文件。只需在Python环境中安装cppimport
库即可。
修改example.cpp
如下:
// cppimport
#include <pybind11/pybind11.h>namespace py = pybind11;int square(int x) {return x * x;
}PYBIND11_MODULE(example, m) {m.def("square", &square);
}
/*
<%
setup_pybind11(cfg)
%>
*/
打开终端,进入到example.cpp
文件所在的src
目录下,打开python解释器运行下面代码:
import cppimport.import_hook
import example #This will pause for a moment to compile the module
example.square(5)
运行结果如下:
PS D:\pybind11_setup_demo\demo\src> python
Python 3.8.12 (default, Oct 12 2021, 03:01:40) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cppimport.import_hook
>>> import example
cl: 命令行 warning D9002 :忽略未知选项“-std=c++11”
cl: 命令行 warning D9002 :忽略未知选项“-fvisibility=hidden”
.rendered.example.cpp正在创建库 ...\pybind11_setup_demo\demo\src\example.cp38-win_amd64.lib 和对象 ...\pybind11_setup_demo\demo\src\example.cp38-win_amd64.exp
正在生成代码
已完成代码的生成
>>> example.square(5)
25
运行成功后,在同目录下会自动生成一个pyd文件。
总结
在pycharm中运行
setup.py
文件进行拓展编译报错:error: Microsoft Visual C++ 14.0 or greater is required.Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
按照这篇文章将python pip error:Microsoft Visual C++ 14.0 or greater is required将Microsoft C++ Build Tools安装成功后,仍然不能在pycharm的终端中运行。只能通过powershell进入文件夹目录下运行
setup.py
文件。这个问题目前还尚待解决。对于包含第三方C++库的pybind11项目编译中
setup.py
文件如何修改的问题,可以参见文章:pybind11—python C/C++扩展编译 - 简书 (jianshu.com)。
pybind11学习 | 在Python中构建编译生成pyd文件相关推荐
- 如何在 Python 中构建跨平台桌面应用程序
如何在 Python 中构建跨平台桌面应用程序 开发桌面 GUI 应用程序曾经是一个乏味.容易出错且缓慢的过程. 当然,Python 在整体上极大地简化了应用程序开发,但在 GUI 领域,仍然没有真正 ...
- Python编程语言学习:python中与数字相关的函数(取整等)、案例应用之详细攻略
Python编程语言学习:python中与数字相关的函数(取整等).案例应用之详细攻略 目录 python中与数字相关的函数 1.对小数进行向上取整 1.1.利用numpy库 1.2.利用math库
- 在 Python 中构建一体化音频分析工具包,在一个地方分析您的音频文件
语言构成了人类之间每次对话的基础.因此,自然语言处理(或简称 NLP)领域无疑在帮助人类日常生活方面具有巨大潜力. 简而言之,NLP 领域包含一组旨在理解人类语言数据并完成下游任务的技术. NLP 技 ...
- python open 打开是什么类型的文件-详解Python中open()函数指定文件打开方式的用法...
文件打开方式 当我们用open()函数去打开文件的时候,有好几种打开的模式. 'r'->只读 'w'->只写,文件已存在则清空,不存在则创建. 'a'->追加,写到文件末尾 'b'- ...
- 从Python中的另一个文件调用函数
本文翻译自:Call a function from another file in Python Set_up: I have a .py file for each function I need ...
- python中如何打开csv文件_Python对CSV文件的处理
原标题:Python对CSV文件的处理 在接口自动化测试中,把测试的数据存储到csv的文件也是一种很不错的选择,下面就详细的介绍如何实现CSV文件内容的读取和如何把数据写入到CSV的文件中.在Pyth ...
- 用python中re.sub()替换文件中指定字符串
用python中re.sub()替换文件中指定字符串 1.正则表达式re.sub()的用法 sub(pattern,repl,string,count=0,flag=0) 1)pattern正则表达式 ...
- python中JSON转XML文件
python中JSON转XML文件 # 接收前台给的json数据 jsonData = json.loads(request.POST.get("jsonData")); # 接收 ...
- 教你在Python中构建物体检测系统(附代码、学习资料)
作者:FAIZANSHAIKH 翻译:闫晓雨 校对:张玲 本文约3200字,建议阅读10分钟. 本文介绍物体检测技术以及解决此领域问题的几种不同方法,带你深入研究在Python中如何构建我们自己的对象 ...
最新文章
- 科技产品下一个重大突破将来自芯片堆叠技术
- BZOJ-2761-不重复数字
- 51Nod 1283 最小周长
- 【深度学习】10个算法从业人员必须知道的TensorFlow技巧
- 网页拉起QQ进行交谈
- POJ 2195 Going Home 二分图的最大权匹配
- 如何提升代码可读性?阿里发布16条设计规约
- [LeetCode] Valid Anagram - 字符串排序比较系列
- Collection 和 Map接口及其实现类总结
- Greenplum segment级问题的排查 - gp_session_role=utility (含csvlog日志格式解读)
- 【点阵液晶编程连载五】液晶驱动代码的移植
- 铁甲雄兵显示服务器维护,《铁甲雄兵》5月17日09:00停机维护公告
- 《谈谈认同》这个文章有点晦涩 写的不太好
- hibernate文档
- win11系统txt文件怎么加密 windows11txt文件加密的解决方法
- 0825torch基础入门操作
- 瑞吉外卖项目学习笔记01
- ESP通过乐为物联控制灯,微信发送数值,ESP上传传感器数据
- java web开发实训心得,【JavaWeb实训心得体会材料】
- 评估方法(交叉验证法、自助法、留出法)
热门文章
- maven 解决Cannot access alimaven (httpmaven.aliyun.comnexuscontentrepositoriescentral)
- pytorch 网络可视化(五):netron
- Vue3 项目遇到的问题
- 选择java还是python-还在纠结选Python还是Java?看完就有数了
- element ui table实现考勤排班表
- 理解矩阵 from孟岩--流星小屋
- 从输入 URL 到浏览器接收的过程中发生了什么事情
- CUDA学习之CUDA执行模型--part3
- Linux 根目录与路径
- 「Arm Arch」 ISA 概述