#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
问题>为什么 Cython 将模块名称生成为module_name.cpython-35m-x86_64-linux-gnu.so
而不是module_name.so
?
谢谢
PEP 3149 中提供了完整的描述。简而言之:这是从Python 3.2开始的更改。版本标识符被特意添加到文件名中;具有此版本标识符的文件名优先于没有此版本标识符的文件名(但是如果没有其他选项可供导入,则将使用没有版本标识符的纯 .so 或.pyd 文件)。
向 .so 或 .pyd 文件添加有关编译所依据的 Python 版本的信息有两个主要优点:
可以将- 与多个版本的 Python 兼容的 .so/.pyd 文件全部编译到同一个目录中,从而更容易为多个版本的 Python 使用或分发库。
- 它可以防止您意外导入为错误版本的 Python 编译的模块。这是一件好事,因为ABI在Python版本之间不是100%兼容的(但可能大部分兼容,这会给你偶尔和令人困惑的错误)
对文件名的更改会影响所有已编译的 Python 模块,而不仅仅是 Cython。
此问题介绍如何更改添加的标识符 - 但是,很少有充分的理由这样做。