如何为多个 Python 版本和平台构建编译模块
Posted
技术标签:
【中文标题】如何为多个 Python 版本和平台构建编译模块【英文标题】:How to build a compiled module for multiple Python versions and platforms 【发布时间】:2018-08-23 01:49:41 【问题描述】:我已经为自己的进程构建了一个 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++",
)))
谢谢。
【问题讨论】:
您可能对多重构建感兴趣:github.com/matthew-brett/multibuild 【参考方案1】:使 manylinux1
可以跨发行版工作的二元轮 - 请参阅 PEP-513
它涉及在官方 PyPa manylinux1
docker 镜像上运行 docker 构建,该镜像为所有 python 版本构建二进制***。
这些***可以分布在 PyPi 上,并且可以跨发行版使用。
限制是构建需要在 Centos5 发行版中完成,manylinux1
映像基于该发行版以实现兼容性。
有关示例,请参阅 PyPa's manylinux demo repository。
【讨论】:
【参考方案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
的回答,这是我忘记的重要一点
【讨论】:
以上是关于如何为多个 Python 版本和平台构建编译模块的主要内容,如果未能解决你的问题,请参考以下文章
android studio,如何为发布版本制作签名的 apk(使用 KTS 构建文件的 gradle)
如何为不同的 OS/Python 版本编译 Python C/C++ 扩展?