用pybind11构建的python模块的Linux平台标签

时间:2017-10-20 12:34:42

标签: c++ python-3.x pypi pybind11

我正在使用pybind11并使用setuptools和cmake构建python模块,如pybind/cmake_example中所述:

setup(
    name='libraryname',
    ...
    ext_modules=[CMakeExtension('libraryname')],
    cmdclass=dict(build_ext=CMakeBuild),
)

在本地,使用python setup.py sdist build一切都很好,我可以使用和/或安装生成的文件包。

我现在想要将软件包上传到PyPI 。 从一个不同的python包我知道如何通过操纵一个轮子的平台标签来生成一个通用的linux库(参见here):

class bdist_wheel(bdist_wheel_):
    def finalize_options(self):
        from sys import platform as _platform
        platform_name = get_platform()
        if _platform == "linux" or _platform == "linux2":
            # Linux
            platform_name = 'manylinux1_x86_64'

        bdist_wheel_.finalize_options(self)
        self.universal = True
        self.plat_name_supplied = True
        self.plat_name = platform_name

setup(
    ...
    cmdclass = {'bdist_wheel': bdist_wheel},
)

问题:

如果没有构建bdist_wheel,如何生成适当的平台标记? 这应该以某种方式构建为轮而不是扩展(可能与this issue on GH相关)?

另外,pybind11如何决定生成的库的后缀(在我的linux上它不只是.so而是.cpython-35m-x86_64-linux-gnu.so)?

随访:

  • 主要问题是我无法将当前Ubuntu构建的软件包更新为PyPI:ValueError: Unknown distribution format: 'libraryname-0.8.0.cpython-35m-x86_64-linux-gnu.so'
  • 如果不能或不应该更改平台标签:跨平台将pybind11模块上传到PyPI的最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

我的不好!

事实证明,混淆是由于我最初尝试运行python setup.py sdist bdist_wheel时出现的构建错误。 使用python setup.py build进行手动构建不是发布软件包的正确方法。

注意:.so文件的名称需要在没有-0.8.0版本标识符的情况下设置,以便python能够从滚轮进行导入。

总结: 构建和发布二进制轮子与pybind11完全相同,例如cpython ,它应该可以正常使用pybind/cmake_example