2

我已经用pybind11swig包装了代码,但似乎找不到有关如何在 pypi 上正确获取该代码的文档,以便我可以pip install打包。

Pybind11似乎存在难以将代码放在 pypi 上的问题

我想我想要的是为 Linux 和 OSX 构建二进制轮子,但我找不到太多关于此的文档。我猜有些人通过 travis 和脚本来做到这一点?是否有一种即插即用的方式来为所有发行版制作轮子?

4

1 回答 1

12

奇怪的是你没有找到任何信息。distutuis和他们的大哥setuptools提供的Extension类允许在安装二进制 Python-C 扩展模块之前构建它们,并且任何非 Python 文件都可以通过MANIFEST.in文件包含在分发中。至于 Pybind11,它是一个只有头文件的库,所以构建一个依赖它的模块应该没有困难。但是,最好在您的发行版中包含 Pybind11 标头(大约有十几个不是很大的.h文件),因为据我所知,distutils/setuptools 不支持二进制模块的预构建依赖项。

假设您的头文件(包括 Pybind11)在includedir 中,而您的源文件在srcdir 中。然后你的setup.py文件应该是这样的:

import os
from setuptools import setup
from setuptools.extension import Extension

this_dir = os.path.dirname(os.path.abspath(__file__))

foo = Extension(
    name='foo',
    include_dirs=[os.path.join(this_dir, 'include')],
    sources=[
        os.path.join(this_dir, 'src', 'foo.cpp'),
        os.path.join(this_dir, 'src', 'bar.cpp')
    ]
)

setup(
    name='foo',
    version='0.0.1',
    author='John Doe',
    description='foo module',
    long_description='blah, blah, blah...',
    url='http://example.com',
    classifiers=[
        # The list of PyPI classifiers
    ],
    ext_modules=[foo],
    zip_safe=False,
    include_package_data=True,
)

您可以添加其他参数,例如宏定义等。你MANIFEST.in应该是这样的:

recursive-include src *.cpp
recursive-include include *.h

现在您可以按照此处所述发布您的包:https ://packaging.python.org我只能注意到他们关于使用的建议twine仅对 HTTPS 支持较差的古代 Python 发行版有效。

现在任何用户都可以通过键入在他们的环境中安装您的包pip install foo,前提是他们已经安装了与他们的 Python 版本兼容的 C/C++ 编译器。这在 Linux 上通常没有问题(我对 Mac 不了解),但在 Windows 上可能是 PITA。因此,为了简化安装,您还可以将预编译的轮子添加到您的源代码分发中,如上面的打包指南中所述。您可以使用一些 CI,例如 Travis 或 Appveyor(基于 Windows 的 CI)来自动编译您的轮子并将它们发布到 PyPI。如果 PyPI 有一个用于目标平台的轮子,则只需将其解包到用户的环境中。否则,模块是从源代码编译的(同样,如果兼容的编译器可用,否则构建/安装将失败)。

我不熟悉 SWIG,但如文档中所述,setuptools 本身也支持在编译期间将 SWIG 包装器转换为 C 代码。SWIG 包装器文件也包含在MANIFEST.in.

如果你的二进制 Python 模块依赖于一些外部预建库,比如 Boost 或 OpenSSL,事情就会变得复杂。正如我所说,setuptools 不支持预构建依赖项,并且在 Windows 上,例如,没有二进制库的中央存储库(尽管 Microsoft 正试图通过创建来修正这种情况vcpkg)。在这种情况下,您要么在包中包含所有内容,要么为尽可能多的平台提供静态编译的轮子,或者以某种方式警告潜在用户他们需要在安装pip二进制模块之前安装一些先决条件。

于 2017-04-07T20:24:53.017 回答