如何为多个 Python 版本和平台构建编译模块



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

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

我有一台装有Python 3.4的Linux(Debian Jessie)机器,所以cythonized使我成为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++", 
)))

谢谢。

制作跨发行版工作的manylinux1二进制轮子 - 参见 PEP-513

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

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

约束是构建需要在 Centos5 发行版中完成,manylinux1映像基于该发行版以实现兼容性。

有关示例,请参阅 PyPa 的 manylinux 演示存储库。

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的回答,这是我忘记的重要一点

最新更新