文章目录

  • 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文件相关推荐

  1. 如何在 Python 中构建跨平台桌面应用程序

    如何在 Python 中构建跨平台桌面应用程序 开发桌面 GUI 应用程序曾经是一个乏味.容易出错且缓慢的过程. 当然,Python 在整体上极大地简化了应用程序开发,但在 GUI 领域,仍然没有真正 ...

  2. Python编程语言学习:python中与数字相关的函数(取整等)、案例应用之详细攻略

    Python编程语言学习:python中与数字相关的函数(取整等).案例应用之详细攻略 目录 python中与数字相关的函数 1.对小数进行向上取整 1.1.利用numpy库 1.2.利用math库

  3. 在 Python 中构建一体化音频分析工具包,在一个地方分析您的音频文件

    语言构成了人类之间每次对话的基础.因此,自然语言处理(或简称 NLP)领域无疑在帮助人类日常生活方面具有巨大潜力. 简而言之,NLP 领域包含一组旨在理解人类语言数据并完成下游任务的技术. NLP 技 ...

  4. python open 打开是什么类型的文件-详解Python中open()函数指定文件打开方式的用法...

    文件打开方式 当我们用open()函数去打开文件的时候,有好几种打开的模式. 'r'->只读 'w'->只写,文件已存在则清空,不存在则创建. 'a'->追加,写到文件末尾 'b'- ...

  5. 从Python中的另一个文件调用函数

    本文翻译自:Call a function from another file in Python Set_up: I have a .py file for each function I need ...

  6. python中如何打开csv文件_Python对CSV文件的处理

    原标题:Python对CSV文件的处理 在接口自动化测试中,把测试的数据存储到csv的文件也是一种很不错的选择,下面就详细的介绍如何实现CSV文件内容的读取和如何把数据写入到CSV的文件中.在Pyth ...

  7. 用python中re.sub()替换文件中指定字符串

    用python中re.sub()替换文件中指定字符串 1.正则表达式re.sub()的用法 sub(pattern,repl,string,count=0,flag=0) 1)pattern正则表达式 ...

  8. python中JSON转XML文件

    python中JSON转XML文件 # 接收前台给的json数据 jsonData = json.loads(request.POST.get("jsonData")); # 接收 ...

  9. 教你在Python中构建物体检测系统(附代码、学习资料)

    作者:FAIZANSHAIKH 翻译:闫晓雨 校对:张玲 本文约3200字,建议阅读10分钟. 本文介绍物体检测技术以及解决此领域问题的几种不同方法,带你深入研究在Python中如何构建我们自己的对象 ...

最新文章

  1. 科技产品下一个重大突破将来自芯片堆叠技术
  2. BZOJ-2761-不重复数字
  3. 51Nod 1283 最小周长
  4. 【深度学习】10个算法从业人员必须知道的TensorFlow技巧
  5. 网页拉起QQ进行交谈
  6. POJ 2195 Going Home 二分图的最大权匹配
  7. 如何提升代码可读性?阿里发布16条设计规约
  8. [LeetCode] Valid Anagram - 字符串排序比较系列
  9. Collection 和 Map接口及其实现类总结
  10. Greenplum segment级问题的排查 - gp_session_role=utility (含csvlog日志格式解读)
  11. 【点阵液晶编程连载五】液晶驱动代码的移植
  12. 铁甲雄兵显示服务器维护,《铁甲雄兵》5月17日09:00停机维护公告
  13. 《谈谈认同》这个文章有点晦涩 写的不太好
  14. hibernate文档
  15. win11系统txt文件怎么加密 windows11txt文件加密的解决方法
  16. 0825torch基础入门操作
  17. 瑞吉外卖项目学习笔记01
  18. ESP通过乐为物联控制灯,微信发送数值,ESP上传传感器数据
  19. java web开发实训心得,【JavaWeb实训心得体会材料】
  20. 评估方法(交叉验证法、自助法、留出法)

热门文章

  1. maven 解决Cannot access alimaven (httpmaven.aliyun.comnexuscontentrepositoriescentral)
  2. pytorch 网络可视化(五):netron
  3. Vue3 项目遇到的问题
  4. 选择java还是python-还在纠结选Python还是Java?看完就有数了
  5. element ui table实现考勤排班表
  6. 理解矩阵 from孟岩--流星小屋
  7. 从输入 URL 到浏览器接收的过程中发生了什么事情
  8. CUDA学习之CUDA执行模型--part3
  9. Linux 根目录与路径
  10. 「Arm Arch」 ISA 概述