在Ubuntu Python 3上构建的Cython + distutils在链接期间更改模块lib名称

时间:2014-08-11 02:13:45

标签: python cython distutils

我正在使用Cython和distutils。 我的一个测试期间,构建了一个二进制扩展模块。在此之后,我的其他测试之一将import二进制模块并对其进行测试。在Travis-CI上,链接器命令更改名称。请参阅下面的屏幕截图:编译器正确构建test01.o,但链接器错误地创建了test01.cpython-34m.so:我想要test01.so

enter image description here

上面的截图适用于Python 3.4; Python 2.7没有发生这个问题,导致我怀疑特定于Python的distutils可能会采取不同的做法。

从我的主脚本调用的distutils setup()函数没有什么特别之处:

setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = ext_modules,
    include_dirs=[numpy.get_include()]
)

此处ext_modulesExtension()类的序列,从distutils.extension导入。

我已经完成了针对2.7和3.4的distutils文档,没有任何东西像我一样跳出来。可能导致名称更改的原因以及我可以在setup()Extension()实例化中指定哪些选项以防止名称更改?


编辑:我已经设置了一个运行Ubuntu 13.10的本地虚拟机,并且可以确认,如上所述,Python 2.7生成test01.so,而Python 3.4生成test01.cpython-34m.so。因此,这个问题与travis-ci无关,我正在删除该标签并编辑标题。


修改:确实是对distutilsmade in 3.2的更改。我还在弄清楚我能做些什么来让我的导入声明看起来正确。


编辑: OMG python docs中的helloworld示例在Ubuntu 13.10上的Python 3.4.1(Anaconda)上生成helloworld.cpython-34m.so。 Python的sysconfig模块以sysconfig.get_config_var('SO') == 'cpython-34m.so'启动。

我感到很咆哮。

1 个答案:

答案 0 :(得分:7)

由于@ncoghlan_dev,神秘解决了。重命名更改在PEP 3149中进行。事实证明,即使二进制扩展模块可能被称为helloworld.cpython-34m.so,当你实际上在python解释器中时,import helloworld 仍然可以工作。我的travis测试失败了,因为我有一个测试,检查编译的.so文件的名称。如果我删除该测试,文件的其余部分仍然可以工作。