为啥 Cython 编译器会生成带有后缀“cpython-35m-x86_64-linux-gnu.so”的 so

Posted

技术标签:

【中文标题】为啥 Cython 编译器会生成带有后缀“cpython-35m-x86_64-linux-gnu.so”的 so【英文标题】:why Cython compiler generates a so with suffix 'cpython-35m-x86_64-linux-gnu.so'为什么 Cython 编译器会生成带有后缀“cpython-35m-x86_64-linux-gnu.so”的 so 【发布时间】:2017-10-14 16:03:52 【问题描述】:
#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

谢谢

【问题讨论】:

之前关于命名规则的问题:***.com/questions/38523941/…。导入时不需要使用全名。全名标识编译上下文,在调试或移植代码时可能会有所帮助。 @hpaulj,感谢您的留言,我已经确认它可以在没有后缀的情况下工作。 这可能也值得阅读python.org/dev/peps/pep-3149 以了解 Python 选择这样做的原因(它不是专门针对 Cython 的事情) 【参考方案1】:

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

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

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

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

This question 描述了如何更改添加的标识符 - 但是,这样做很少有充分的理由。

【讨论】:

以上是关于为啥 Cython 编译器会生成带有后缀“cpython-35m-x86_64-linux-gnu.so”的 so的主要内容,如果未能解决你的问题,请参考以下文章

将 Cython 生成的 .c 文件编译成 exe 文件

为啥plsql develope 打开.sql文件时会生成后缀名为.~sql文件

分发 Cython 生成的 cpp 文件

cython编译Python为c语言

带有 GSL 的 Windows 64 中的 Cython

python怎么使用cython