首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将swig/pybind11 C++项目放在pypi上

如何将swig/pybind11 C++项目放在pypi上
EN

Stack Overflow用户
提问于 2017-03-08 03:11:15
回答 1查看 1.9K关注 0票数 2

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

Pybind11 seems to have issues that make it difficult to put code on pypi.

我想我想要的是为Linux和OSX构建二进制轮子,但我找不到太多关于这方面的文档。我猜是Some people do this via travis and scripting吧?有没有一种即插即用的方式来制作适用于所有发行版的轮子?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-08 04:24:53

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

让我们假设您的头文件(包括Pybind11)在include目录中,源文件在src目录中。然后,您的setup.py文件应该如下所示:

代码语言:javascript
运行
复制
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应该如下所示:

代码语言:javascript
运行
复制
recursive-include src *.cpp
recursive-include include *.h

现在你可以在这里发布你的包了:https://packaging.python.org我只能注意到他们关于使用twine的建议只适用于早期的Python发行版,而且对HTTPS的支持很差。

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

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

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

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42656388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档