尝试在manylinux上构建python二进制模块:find_package(Python3)仅适用于Development.Module

问题描述 投票:0回答:1

我正在构建一个Python模块,我想将其分发到多个Linux发行版,其中一些发行版的gcc版本比我正在构建的版本要低,因此我使用manylinux。特别是,我使用的是 manylinux_2_28,它基于 alma(Red Hat 系列)并提供 gcc12。

下载镜像后,我克隆了我的存储库,并且几乎已经让 CMake 配置可以工作了。问题始于

find_package(Python3 ${REQUESTED_PYTHON_VERSION} COMPONENTS Interpreter Development)

这给出了

Could NOT find Python3 (missing: Python3_LIBRARIES Development Development.Embed) (found version "3.12.3")

随后引入 pybind11 时出现配置错误。

图片提供Python

CPython 3.6、3.7、3.8、3.9、3.10、3.11、3.12、3.13 和 PyPy 3.7、3.8、3.9、3.10 安装在 /opt/python/- 中。这些目录以每个环境的 PEP 425 标签命名——例如/opt/python/cp37-cp37m 包含 CPython 3.7 版本,可用于生成名为 --cp37-cp37m-.whl 的轮子。

因此,在配置之前,我在

PATH
前面加上
/opt/python/cp312-cp312/bin
,以便
which python3
=>
/opt/python/cp312-cp312/bin/python3

我最初的问题是如何克服这个问题。然而,通过更多的搜索,我在CMake discourse上找到了答案。 IE。使用

Development.Module
而不是
Development

find_package(Python3 ${REQUESTED_PYTHON_VERSION} COMPONENTS Interpreter Development.Module)

正如我所希望的那样,Python 开发已经适用于每个版本。但这里发生了什么? CMake 实际寻找的是

Development.Module
而不是
Development
,以及 gcc / 链接器想要的底层文件是什么——大概这些是
include
lib
/opt/python/cp312-cp312/
 下的文件

c++ python-3.x cmake
1个回答
0
投票

自 CMake 3.18 起,FindPython 模块

Development
拆分为
Development.Module
Development.Embed
。前者是创建Python模块,后者是创建嵌入Python解释器的程序。

许多linux都有用于创建模块的库,但没有用于嵌入式Python的库。所以在Manylinux上你必须使用

Development.Module


顺便说一句,您应该使用

find_package(Python …)
而不是
find_package(Python3 …)
。当必须同时管理 Python 2 和 3 时,需要
FindPython2
FindPython3
模块。 Python 2 已经生命终结很长一段时间了,Python 如今始终是 Python 3。通过不在任何地方明确使用“Python 3”,当 Python 4 到来时,转换到 Python 4 会更容易。

© www.soinside.com 2019 - 2024. All rights reserved.