我们有一个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内置的
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