Cython 编译将文本附加到文件名,如何摆脱它?

Posted

技术标签:

【中文标题】Cython 编译将文本附加到文件名,如何摆脱它?【英文标题】:Cython compilation appends text to filename, how to get rid of it? 【发布时间】:2017-08-06 15:08:38 【问题描述】:

我正在 Ubuntu 平台上使用 cython。一切都很好,除了有一件事让我烦恼。将 cython 项目编译为 .so 文件时,.pyx 文件的文件名会附加“cpython-36m-x86_64-linux-gnu”。 例如,如果我构建“helloworld.pyx”,则生成的 .so 文件称为:“helloworld.cpython-36m-x86_64-linux-gnu.so”。然而,我只是希望它被称为“helloworld.so”。

我认为答案会很简单,所以我开始在谷歌上搜索,即使 30 分钟后我也找不到任何关于该主题的内容。有人知道吗?

这是我的 .pyx 文件:

print('hello world')

setup.py 文件:

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("helloworld.pyx")
)

构建文件:

python setup.py build_ext --inplace
Compiling helloworld.pyx because it changed.
[1/1] Cythonizing helloworld.pyx
running build_ext
building 'helloworld' extension
gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/**/anaconda3/include/python3.6m -c helloworld.c -o build/temp.linux-x86_64-3.6/helloworld.o
gcc -pthread -shared -L/home/**/anaconda3/lib -Wl,-rpath=/home/ed/anaconda3/lib,--no-as-needed build/temp.linux-x86_64-3.6/helloworld.o -L/home/**/anaconda3/lib -lpython3.6m -o /home/**/new_project/helloworld.cpython-36m-x86_64-linux-gnu.so

【问题讨论】:

即使有额外的文字 import helloworld 也能正常工作。您可以尝试在创建后编辑文件名,或制作副本。但我只是顺其自然。它不会妨碍我。 gcc 命令的结尾从-o /home/paul/mypy/cython3/try_numpy/iterate.cpython-35m-i386-linux-gnu.so 更改为-o ./iterate.so,会更改生成的.so 名称。但我找不到在setup 文件中指定-o 选项的方法。 Change Cython's naming rules for .so files的可能重复 【参考方案1】:

你无法摆脱它,至少不能自动摆脱。 PEP 3149 定义了要包含在已编译模块的文件名中的标签:https://www.python.org/dev/peps/pep-3149/

标签包括 Python 实现(此处为 cpython)、版本(此处为 36 用于 3.6)、编译时选项的标志(m 用于使用 Python 的内存分配器,这是默认设置)。平台标签 x86_64-linux-gnu 不是 PEP 3149 的一部分,我不知道它是在哪里定义的。

这些更改是在 distutils 中实现的,而 cython 不是“罪魁祸首”:-)

包的导入名称不受此文件名的影响。

您是否有任何不遵守 PEP 3149 的具体原因?您可以通过手动发出链接器命令来替换设置文件的构建过程,但这不太方便。

【讨论】:

【参考方案2】:

只需在/usr/lib/python3.6/disutils/command/build_ext.py 中更改一行

    def get_ext_filename(self, ext_name):

        from distutils.sysconfig import get_config_var
        ext_path = ext_name.split('.')
        ext_suffix = get_config_var('EXT_SUFFIX') 
        return os.path.join(*ext_path) + ext_suffix

ext_suffix = get_config_var('EXT_SUFFIX') 更改为 ext_suffix = ".so" 或 Windows 上的 ".pyd"

就是这样,你再也不用担心输出名称了

【讨论】:

以上是关于Cython 编译将文本附加到文件名,如何摆脱它?的主要内容,如果未能解决你的问题,请参考以下文章

如何最好地将 C++/Cython 项目编译成可执行文件?

将PCL链接到Cython C ++模块

Pycharm 中 Cython 的文件观察器

如何并行执行 cython 文件编译?

使用 cuda 的 cython 扩展

如何摆脱错误?