乐趣区

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

前言

真的良久没有分享技术文章了, 次要是因为本人写的文章太过于小众, 没想到本人居然会分享这样一篇文章。这么一篇稀释了本人多年来我的项目开发的实战经验。
不得不说,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 种形式。

退出移动版