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

doo*_*oom 5 python software-distribution cython python-3.x 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++", 
        )))
Run Code Online (Sandbox Code Playgroud)

谢谢。

chr*_*isb 2

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