我为自己的进程构建了一个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++",
)))
感谢。
答案 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
的回答,这是我忘记的重点