如何为不同的 OS/Python 版本编译 Python C/C++ 扩展?

Posted

技术标签:

【中文标题】如何为不同的 OS/Python 版本编译 Python C/C++ 扩展?【英文标题】:How do you compile Python C/C++ extensions for different OS/versions of Python? 【发布时间】:2012-01-04 04:11:14 【问题描述】:

我注意到几个成熟的 Python 库已经为大多数架构(Win32/Win-amd64/MacOS)和 Python 版本预编译了版本。为不同环境交叉编译扩展的标准方法是什么?葡萄酒?虚拟机?众包?

【问题讨论】:

你可以找到一些关于这个in the official Python docs的有限信息。 谢谢,但这只是部分回答了问题。 我认为Christoph Gohlke 可以回答这个问题。我引起了他的注意。 这是如何开发跨平台代码还是实际交叉编译的问题? 抱歉,回答迟了。问题是关于实际的交叉编译。我已经看到一些严肃的项目(例如 Numpy)为几乎所有流行的架构提供了一个包。所以问题是他们通常如何做到这一点?人们是否有使用这些操作系统的物理/虚拟机,或者他们众包实际编译,或者有一些用于交叉编译的在线服务? 【参考方案1】:

我们使用虚拟机和Hudson 服务器。

我们支持的每个架构都有一个虚拟机(通常编译不会拉伸分配给它们的资源,所以虚拟机就可以了)。我猜每个虚拟机的配置都可以由 Puppet 或 Chef 之类的东西来管理,以确保它是一个合适的构建环境。如果你有硬件当然可以使用真机,但你要避免使用人们实际使用的机器(例如开发人员工作站)。

然后,我们使用 Hudson 中的多配置项目来设置构建矩阵。构建矩阵允许我们(只需单击一下)在多种架构上构建多个 python 版本,但理论上您可以构建您可以在矩阵中设置的所有组合。当然,您可以改用 Jenkins。

【讨论】:

如果您的目标之一是 osX,那么猜测 vm 方式可能是“半”非法的 :) 似乎 VM 方式可能是最好的选择。 OSX 已经允许虚拟化一段时间了:macworld.com/article/1163755/… 我们实际上使用了一个专门用于 OSX 而不是虚拟服务器的小型 mac mini 农场 - 抱歉,应该在原始答案中澄清这一点。尤其是从 ebay 上买的时候,这些都足够便宜,满足我们的需求,而且只是堆放在机房的一角。但正如 hbar 所说,虚拟化这些现在也是一种合法的选择。【参考方案2】:

SWIG 为多平台代码生成提供了途径。

【讨论】:

对不起,我不清楚。问题是关于实际编译,而不是代码开发。【参考方案3】:

我所有的 Python 扩展模块都是 C++,而不是 C,所以我使用 boost Python。当我需要支持不同的操作系统时,我也会使用虚拟机。 Boost 的 bjam 构建驱动程序允许您使用不同版本的 Python(2.6、2.7)构建不同版本的 g++ 和其他各种东西。如果我有一个非常流行的扩展模块并且很多人想在我没有的平台上使用它,那么我会确保我的代码非常便携(无论如何应该是)并提供有关我如何构建它的说明使用 bjam 为不同的 Python 版本等使用几个不同的示例。这足以让他们开始。如果这可行,您可以要求他们回馈他们的构建,以便其他人可以使用它们(当然不受您的支持)。

【讨论】:

以上是关于如何为不同的 OS/Python 版本编译 Python C/C++ 扩展?的主要内容,如果未能解决你的问题,请参考以下文章

如何为不同的用户维护不同的编译库?

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

如何为特定部署 macOS 版本编译 OpenSSL 库?

cmake - 如何为英特尔编译器设置不同的变量

如何为不同的 linux 内核编译一个 linux 内核模块

如何为python安装不同版本的模块