在 virtualenvs 中生成扩展模块文件名后缀的首选方式是什么

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

我们有一个Python项目,它有一个基于pybind11的C++扩展模块。我们使用

python3-config --extension-suffix
来获取扩展模块的文件名后缀。它在仅安装一个主要版本的 Python 的系统上运行良好。

现在我们正在尝试在单个系统中构建多个Python版本的扩展模块。因此我们创建了一个安装了多个Python版本的系统,每个版本都有相应的虚拟环境。那么问题就出现了:python3-config在虚拟环境中不可用,因此执行的python3-config的版本可能与激活的virtualenv的版本不匹配。例如,即使激活了 python3.8 virtualenv,

python3-config --extension-suffix
也可能会输出
.cpython-311-x86_64-linux-gnu.so

我能想到的唯一方法是将相应版本的python3-config复制到virtualenv的bin目录中,但是我们必须记住每次创建新的virtualenv时都执行此操作,否则生成的wheel将无法工作。所以我想知道是否有更好的方法以及人们在 virtualenvs 中构建扩展模块时通常会做什么。

python virtualenv
1个回答
0
投票

我遇到了同样的问题,这是我的解决方案。

您可以使用Python内置的

sysconfig
模块来获取扩展模块的文件名后缀。为此,您需要从 python 调用
sysconfig.get_config_var("EXT_SUFFIX")

因此运行

python -c 'import sysconfig; print(sysconfig.get_config_var("EXT_SUFFIX"))'
将返回想要的文件名后缀,因为它将使用Python版本的虚拟环境:

❯ python -c 'import sysconfig; print(sysconfig.get_config_var("EXT_SUFFIX"))'
.cpython-312-x86_64-linux-gnu.so
© www.soinside.com 2019 - 2024. All rights reserved.