为什么Cython编译器使用后缀"cpython-35m-x86_64-linux-gnu.so"生成一个

q09*_*987 6 python cython

#setup.py    
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
    cmdclass = {'build_ext': build_ext}, 
    ext_modules = [Extension("module_name", ["xxxx.pyx", './yyyyy.c'],
                    language='c',
                    extra_compile_args = ['-std=gnu11'],
                    extra_link_args=['-std=gnu11']                 
                    )]
)


$ python --version
Python 3.5.1
$ python -c "import cython; print(cython.__version__);"
0.25.2
$ python setup.py build_ext -i
Run Code Online (Sandbox Code Playgroud)

问题>为什么Cython生成模块名称module_name.cpython-35m-x86_64-linux-gnu.so而不是module_name.so

谢谢

Dav*_*idW 6

PEP 3149 中有完整的描述。简而言之:这是从 Python 3.2 开始适用的更改。版本标识符被故意添加到文件名中;具有此版本标识符的文件名优先于那些没有的文件名(但如果没有其他选项可用于导入,则将使用没有版本标识符的纯 .so 或 .pyd 文件)。

向 .so 或 .pyd 文件添加有关编译所针对的 Python 版本的信息有两个主要优点:

  1. 可以将与多个 Python 版本兼容的 .so/.pyd 文件都编译到同一目录中,从而更容易使用或分发多个 Python 版本的库。
  2. 它可以防止您意外导入为错误版本的 Python 编译的模块。这是一件好事,因为 ABI 在 Python 版本之间不是 100% 兼容的(但很可能是大部分兼容的,这会给您带来偶尔和令人困惑的错误)

对文件名的更改会影响所有已编译的 Python 模块,而不仅仅是 Cython。

这个问题描述了如何更改添加的标识符 - 然而,这样做的理由很少。