发布:如何为多个python版本和平台构建一个编译模块

时间:2018-03-14 13:43:06

标签: python python-3.x cython software-distribution cythonize

我为自己的进程构建了一个python 3模块。

我使用cython编译和包装C ++源代码。

我有一台带有python 3.4的linux(Debian Jessie)机器,因此cythonize让我成为Processing.cpython-34m.so并将其复制到/usr/local/lib/python3.4/dist-packages

但是当我在另一台有python3.5的机器上使用它时,我必须重新编译所有内容。

如何从我的机器上为所有python 3版本和多个平台构建一个linux或pip包(这里只是Jessie和Stretch,它们可能非常封闭的确相等)? 最好不要在我的机器上安装所有版本的python 3.

这是我用于cythonization的setup.py文件:

from distutils.core import setup, Extension
from Cython.Build import cythonize

setup(ext_modules = cythonize(Extension(
            "MyProcessing",
            sources=["MyProcessing.pyx", "myprocess.cpp", "mythirdp.cpp"],
            language="c++", 
        )))

感谢。

2 个答案:

答案 0 :(得分:2)

使manylinux1二进制轮子在分布中运行 - 请参阅PEP-513

它涉及在官方PyPa manylinux1 docker图像上运行docker build,为所有python版本构建二进制轮。

这些轮子可以在PyPi上分发,并且可以在发行版中使用。

约束是构建需要在Centos5发行版中完成,而manylinux1图像是基于兼容性的。{/ p>

有关示例,请参阅PyPa's manylinux demo repository

答案 1 :(得分:1)

Python轮子与python ABI绑定。 ABI在次要版本中是稳定的,这就是为什么你的车轮有34标签 - 典型的解决方案是为你想要支持的每个次要版本的python创建一个轮子,所以你需要安装所有这些版本。有关详情,请参阅PEP 425

对于python 3.2+,有一个稳定的ABI'的定义。适用于所有版本。我不确定究竟是什么限制,而且我的知识是cython不能使用它,但我相信手写的扩展你可以创建一个适用于所有版本的python 3的轮子。

远离cython,如果你主要包装c代码,另一个潜在的解决方案是CFFI。它没有链接到libpython,所以我认为你可以生成一个独立于版本的轮子。这不是我使用的东西,但Armin Ronacher有一个似乎直接解决这个问题的方案 https://github.com/getsentry/milksnake

编辑:请务必阅读@ danny关于manylinux的回答,这是我忘记的重点