如何获取编译后Python模块的平台/版本后缀字符串?
绝对有标准方法!你需要的是Python自带的sysconfig模块——它专门用来获取Python编译和运行时的配置信息,其中就包含了你要的扩展模块后缀标识。
方法1:直接获取完整后缀(EXT_SUFFIX)
如果你需要的是从.开始的完整后缀(比如.cpython-36m-x86_64-linux-gnu.so),可以直接运行:
python -c "import sysconfig; print(sysconfig.get_config_var('EXT_SUFFIX'))"
这个命令会输出当前Python版本对应的扩展模块完整后缀,和SWIG生成的文件名后缀完全匹配。
方法2:获取SOABI标识(更精准)
如果你只需要_libdivvun后面的中间标识部分(比如cpython-36m-x86_64-linux-gnu),可以用SOABI(Shared Object Application Binary Interface)变量,这是Python定义的标准标识:
python -c "import sysconfig; print(sysconfig.get_config_var('SOABI'))"
比如在你的例子中:
- Linux Python3.6会输出
cpython-36m-x86_64-linux-gnu - 旧版Linux Python3.5会输出
cpython-3.5m - macOS Python3.5会输出
cpython-35m-darwin
完全对应你看到的模块文件名中的标识部分,用这个来拼接模块名或者做打包判断最可靠。
为什么不用手动拼接?
你可能会想通过sys.version_info或者platform模块来自己拼,但这种方法很容易出错——不同平台、不同编译选项下的后缀规则有差异(比如macOS和Linux的后缀格式不同,部分Python版本会带m表示启用了Py_DEBUG),而sysconfig是Python官方维护的配置源,完全适配当前环境的实际编译情况。
兼容性说明
sysconfig模块在Python 2.7+和Python 3.2+都是内置的,几乎覆盖了所有你可能用到的版本。如果是非常老旧的Python版本(比如Python2.6及以下),可以用distutils.sysconfig替代,但注意distutils在Python3.10+已经被标记为弃用,优先用sysconfig。
内容的提问来源于stack exchange,提问作者unhammer

