Ale*_*ail 2 python swig pypi pybind11
我有代码包裹着两个pybind11和痛饮,但似乎无法找到如何正确获取PyPI上的代码,所以我可以文档pip install我的包。
Pybind11 似乎有一些问题,使得很难在pypi上放置代码。
我想我要的是建立Linux和OSX二轮,但我不能找到有关这个多文档。我猜有人通过travis和脚本执行此操作吗?有一种即插即用的方式来制造所有发行版的轮子吗?
奇怪的是您还没有找到任何信息。distutuis他们的哥哥setuptools提供Extension了允许在安装二进制Python-C扩展模块之前安装它们的类,并且所有非Python文件都可以通过MANIFEST.infile 包含在发行版中。至于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,
)
Run Code Online (Sandbox Code Playgroud)
您可以添加其他参数,例如宏定义等。您MANIFEST.in应该看起来像这样:
recursive-include src *.cpp
recursive-include include *.h
Run Code Online (Sandbox Code Playgroud)
现在,您可以按如下所述发布软件包:https : //packaging.python.org我只能注意,他们的使用建议twine仅对HTTPS支持较差的古代Python发行版有效。
现在pip install foo,只要已安装与Python版本兼容的C / C ++编译器,任何用户都可以通过输入来在您的环境中安装您的软件包。在Linux(我对Mac不了解)上通常没有问题,但在Windows上可能是PITA。因此,为简化安装,您还可以按照上述包装指南中的说明,将预编译的转轮添加到源代码发行版中。您可以使用诸如Travis或Appveyor(基于Windows的CI)之类的CI来自动完成轮子的编译并将其发布在PyPI上。如果PyPI有一个用于目标平台的轮子,则可以简单地将其解压缩到用户的环境中。否则,将从源中编译该模块(同样,如果有兼容的编译器可用,否则构建/安装将失败)。
我不熟悉SWIG,但正如文档中所述,setuptools本身也支持在编译期间将SWIG包装器转换为C代码。SWIG包装文件也通过包含MANIFEST.in。
如果您的二进制Python模块依赖某些外部预构建库(例如Boost或OpenSSL),事情就会变得很复杂。就像我说的那样,setuptools不支持预构建依赖关系,例如,在Windows上,没有二进制库的中央存储库(尽管Microsoft试图通过创建来修正这种情况vcpkg)。在这种情况下,您要么将所有内容都包含在软件包中,要么为尽可能多的平台提供静态编译的轮子,或者以某种方式警告潜在用户,他们需要在安装pip二进制模块之前先安装一些先决条件。
| 归档时间: |
|
| 查看次数: |
959 次 |
| 最近记录: |