如何将 swig/pybind11 C++ 项目放到 pypi 上
How to put a swig/pybind11 C++ project on pypi
我的代码都包含在 pybind11 and swig 中,但似乎无法找到有关如何在 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 我猜?是否有一种即插即用的方式来为所有发行版制作轮子?
很奇怪,您没有找到任何信息。 distutuis
和他们的大哥 setuptools
提供 Extension
class 允许在安装之前构建二进制 Python-C 扩展模块,任何 non-Python 文件都可以通过 MANIFEST.in
文件包含在分发中。至于 Pybind11,它是一个 header-only 库,因此构建依赖于它的模块应该没有困难。但是,最好在您的发行版中包含 Pybind11 headers(大约有十几个不是很大的 .h
文件),因为据我所知,distutils/setuptools 不支持 pre-build 二进制模块的依赖关系。
假设您的 header 文件(包括 Pybind11)在 include
目录中,您的源文件在 src
目录中。那么您的 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。因此,为了简化安装,您还可以按照上面打包指南中的说明,将 pre-compiled wheels 添加到您的源代码分发中。您可以使用一些 CI,例如 Travis 或 Appveyor (Windows-based CI) 来自动编译您的轮子并将它们发布到 PyPI 上。如果 PyPI 有一个用于目标平台的轮子,它可以简单地解包到用户的环境中。否则,该模块是从源代码编译的(同样,如果兼容的编译器可用,否则 build/install 将失败)。
我不熟悉 SWIG,但如 documentation 中所述,setuptools 本身也支持在编译期间将 SWIG 包装器转换为 C 代码。 SWIG 包装文件也包含在 MANIFEST.in
.
中
如果您的二进制 Python 模块依赖于某些外部 pre-built 库,例如 Boost 或 OpenSSL,事情就会变得复杂。正如我所说,setuptools 不支持 pre-build 依赖项和 Windows,例如,没有二进制库的中央回购(尽管微软试图通过创建 vcpkg
来改变这种情况) .在这种情况下,您要么在包中包含所有内容,要么为尽可能多的平台提供静态编译的轮子,或者以某种方式警告潜在用户他们需要在 pip
- 安装二进制模块之前安装一些先决条件。
我的代码都包含在 pybind11 and swig 中,但似乎无法找到有关如何在 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 我猜?是否有一种即插即用的方式来为所有发行版制作轮子?
很奇怪,您没有找到任何信息。 distutuis
和他们的大哥 setuptools
提供 Extension
class 允许在安装之前构建二进制 Python-C 扩展模块,任何 non-Python 文件都可以通过 MANIFEST.in
文件包含在分发中。至于 Pybind11,它是一个 header-only 库,因此构建依赖于它的模块应该没有困难。但是,最好在您的发行版中包含 Pybind11 headers(大约有十几个不是很大的 .h
文件),因为据我所知,distutils/setuptools 不支持 pre-build 二进制模块的依赖关系。
假设您的 header 文件(包括 Pybind11)在 include
目录中,您的源文件在 src
目录中。那么您的 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。因此,为了简化安装,您还可以按照上面打包指南中的说明,将 pre-compiled wheels 添加到您的源代码分发中。您可以使用一些 CI,例如 Travis 或 Appveyor (Windows-based CI) 来自动编译您的轮子并将它们发布到 PyPI 上。如果 PyPI 有一个用于目标平台的轮子,它可以简单地解包到用户的环境中。否则,该模块是从源代码编译的(同样,如果兼容的编译器可用,否则 build/install 将失败)。
我不熟悉 SWIG,但如 documentation 中所述,setuptools 本身也支持在编译期间将 SWIG 包装器转换为 C 代码。 SWIG 包装文件也包含在 MANIFEST.in
.
如果您的二进制 Python 模块依赖于某些外部 pre-built 库,例如 Boost 或 OpenSSL,事情就会变得复杂。正如我所说,setuptools 不支持 pre-build 依赖项和 Windows,例如,没有二进制库的中央回购(尽管微软试图通过创建 vcpkg
来改变这种情况) .在这种情况下,您要么在包中包含所有内容,要么为尽可能多的平台提供静态编译的轮子,或者以某种方式警告潜在用户他们需要在 pip
- 安装二进制模块之前安装一些先决条件。