• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于python:C如何快速生成Python的C扩展md

python 搞代码 3年前 (2022-02-20) 13次浏览 已收录 0个评论
文章目录[隐藏]

前言

真的良久没有分享技术文章了,次要是因为本人写的文章太过于小众,没想到本人居然会分享这样一篇文章。这么一篇稀释了本人多年来我的项目开发的实战经验。
不得不说,Python是一门很不错的编程语言。有时候,为了我的项目代码平安思考,会尝试将一些源代码应用Python提供的C API的形式进行编写,再将其编译为Python模块的形式,从而在Python中间接调用。

编译的一些技巧

对于Python的C API编写的代码,如果疾速将其生成为Python对应的扩大库,如Linux下的.so或Windows下的.pyd
次要有如下一些办法:

  • 应用setuptools模块
  • 应用scikit-build模块
  • 应用cmake

实际上这些办法常常是在一起应用的。
对于手动编写setup.py文件,指定对应的要引入的头文件及链接库,对于中大型项目是不举荐的。

setuptools形式

在此之前,先应用如下的形式学生成1个C源文件:

pip install pyd-tpl
pyd-tpl hello

该模块是本人编写用于疾速生成Python的C扩大文件的一个库。装置实现后,咱们调用pyd-tpl命令会在当前目录下生成1个hello.c源文件及setup_hello.py文件。
咱们能够间接执行如下的形式进行编译并生成1个hello模块:

python setup_hello.py

这是第1种应用setuptools生成模块的形式。上面次要介绍前面两种形式。

scikit-build形式

首先咱们运行上面的命令装置对应的库:

pip install scikit-build cmake

因为scikit-build依赖于cmake,咱们能够间接应用pip的形式装置该工具。
装置实现后,接着咱们在setup.py中编写如下的代码:

from skbuild import setup

之后在我的项目目录下新建1个CMakeLists.txt,其内容如下:

cmake_minimum_required(VERSION 3.11.0)
project(hello VERSION 0.1.0)
find_package(PythonExtensions REQUIRED)
add_library("${PROJECT_NAME}" MODULE hello.c)
python_extension_module("${PROJECT_NAME}")
install(TARGETS hello LIBRARY DESTINATION hello)

这里咱们设置咱们我的项目的名称为hello,通过应用cmake提供的find_package指令寻找Python的扩大。之后通过add_libraryhello.c文件编译,从而生成以项目名称命名的模块。
接着还须要在我的项目目录下创见1个pyproject.toml的文件,其内容如下:

[build-system]
requires = ["setuptools", "wheel", "scikit-build", "cmake", "ninja"]

之后咱们运行如下的命令即可实现整个过程的主动编译:

python setup.py build

不过这种形式有个不好的中央在于,如果零碎无奈失常辨认你的编译器,比方在Windows下我应用的是Visual Studio 2015,它并没有很好的辨认进去。只能在Visual Studio 2015工具提供的菜单窗口下运行才行。
其过程如下图所示:

cmake原生形式

在cmake版本3.12开始,提供了1个十分好用的Python_add_library命令,详情能够参考。借助该命令,咱们能够疾速生成Python的C扩大。
咱们只须要在上述CMakeLists.txt中的内容进行如下的批改:

cmake_minimum_required(VERSION 3.12.0)
project(hello VERSION 0.1.0)
find_package (Python3 COMPONENTS Development)
include_directories(${Python3_INCLUDE_DIRS})
Python3_add_library(hello MODULE hello.c)

该命令语法与add_library命令一样。在这里,咱们应用的是Python3,因而在find_package命令中指定的应用Python3。
之后在Windows下创立1个build目录,并进入该目录中再执行如下命令:

mkdir build
cd build
cmake -G "Visual Studio 14 2015" -A x64 ..
cmake --build . --config Release

而对于Linux将相应的命令批改为:

cmake ..
make

通过cmake工具,这样咱们就能够轻松地生成对应Python的hello.pydhello.so的C扩大。

后语

实际上,对于生成Python的C扩大还有1种形式就是将cmake与setup.py文件联合,通过setup.py文件中setup函数的cmdclass参数指定自定义1个cmake编译类。
实际上,在理论我的项目开发中,真的没必要搞得这么简单,将1个非常简单的问题复杂化是得失相当的。
这里就不开展介绍了,应用上述3种办法即可很轻松解决Python的C扩大编译的问题。其中最举荐应用第3种形式。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于python:C如何快速生成Python的C扩展md

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址