我已经用pybind11和swig包装了代码,但似乎找不到有关如何在 pypi 上正确获取该代码的文档,以便我可以pip install
打包。
Pybind11似乎存在难以将代码放在 pypi 上的问题。
我想我想要的是为 Linux 和 OSX 构建二进制轮子,但我找不到太多关于此的文档。我猜有些人通过 travis 和脚本来做到这一点?是否有一种即插即用的方式来为所有发行版制作轮子?
我已经用pybind11和swig包装了代码,但似乎找不到有关如何在 pypi 上正确获取该代码的文档,以便我可以pip install
打包。
Pybind11似乎存在难以将代码放在 pypi 上的问题。
我想我想要的是为 Linux 和 OSX 构建二进制轮子,但我找不到太多关于此的文档。我猜有些人通过 travis 和脚本来做到这一点?是否有一种即插即用的方式来为所有发行版制作轮子?
奇怪的是你没有找到任何信息。distutuis
和他们的大哥setuptools
提供的Extension
类允许在安装二进制 Python-C 扩展模块之前构建它们,并且任何非 Python 文件都可以通过MANIFEST.in
文件包含在分发中。至于 Pybind11,它是一个只有头文件的库,所以构建一个依赖它的模块应该没有困难。但是,最好在您的发行版中包含 Pybind11 标头(大约有十几个不是很大的.h
文件),因为据我所知,distutils/setuptools 不支持二进制模块的预构建依赖项。
假设您的头文件(包括 Pybind11)在include
dir 中,而您的源文件在src
dir 中。然后你的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
二进制模块之前安装一些先决条件。