前言
真的良久没有分享技术文章了,次要是因为本人写的文章太过于小众,没想到本人居然会分享这样一篇文章。这么一篇稀释了本人多年来我的项目开发的实战经验。
不得不说,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_library
对hello.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.pyd
及hello.so
的C扩大。
后语
实际上,对于生成Python的C扩大还有1种形式就是将cmake与setup.py
文件联合,通过setup.py
文件中setup函数的cmdclass
参数指定自定义1个cmake编译类。
实际上,在理论我的项目开发中,真的没必要搞得这么简单,将1个非常简单的问题复杂化是得失相当的。
这里就不开展介绍了,应用上述3种办法即可很轻松解决Python的C扩大编译的问题。其中最举荐应用第3种形式。