我有用pybind11和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吧?有没有一种即插即用的方式来制作适用于所有发行版的轮子?
发布于 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文件应该如下所示:
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的建议只适用于早期的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你的二进制模块之前安装一些先决条件。
https://stackoverflow.com/questions/42656388
复制相似问题