查看 Python 模块和 Python 框架中“lib-dnyload”目录中的代码,我注意到每当代码创建某种 GUI 或图形时,它都会导入一个扩展名为 .so 的非 Python 文件。“lib-dnyload”中有大量 .so 文件。
通过谷歌搜索,我发现这些文件被称为共享对象,并且是用 C 或 C++ 编写的。我有一台 Mac,我使用 GCC。如何制作可通过 Python 访问的共享对象文件?主要是如何使用 GCC 使用 Mac OS X 制作共享对象。
查看 Python 模块和 Python 框架中“lib-dnyload”目录中的代码,我注意到每当代码创建某种 GUI 或图形时,它都会导入一个扩展名为 .so 的非 Python 文件。“lib-dnyload”中有大量 .so 文件。
通过谷歌搜索,我发现这些文件被称为共享对象,并且是用 C 或 C++ 编写的。我有一台 Mac,我使用 GCC。如何制作可通过 Python 访问的共享对象文件?主要是如何使用 GCC 使用 Mac OS X 制作共享对象。
官方 python 文档从简单的示例开始。已经足够开始了。
在我看来,最简单的方法是使用Cython。Cython 将为您生成一些 C 代码,将其编译为一个“.so”库,您可以从 python 加载该库。这是容易和无痛的。我建议您按照教程进行操作,您应该很快就会拥有一个 so 库。
如果您想了解 Python 的 C 扩展背后的所有细节,您应该深入了解有关 C 扩展的 Python 文档。
使用 Python 构建和安装 C 扩展模块的标准方法是使用包含在标准 Python 库中的Distutils的功能。通常,这意味着在您的项目目录中包含 C 文件并创建一个配置文件,通常称为setup.py
,以识别 C 源文件。setup.py
通过在 Python 下运行正确配置的文件,Distutils
将使用系统的 C 编译器和链接器来编译和链接 C 源文件。(在 OS X 上,您需要安装 Apple 的免费Xcode
开发者工具,它会安装gcc
. 这是一个简单的教程这应该足以让你开始。
为什么要使用 Distutilssetup.py
而不是自己调用 gcc?几个原因:
由于 C 扩展通常在 Python 解释器本身的上下文中运行,因此以与解释器中的 C 代码兼容的方式编译和链接扩展非常重要。Distutils 试图通过为您正在执行的 Python 提供正确的选项来消除这种猜测。这在 OS X 上尤其重要,其中 Python 有各种风格,包括一些具有多架构可执行文件的各种组合(即-arch i386
, -arch ppc
, -arch x86_64
, -arch ppc64
)并支持多个 OS X 版本(即当前的 python.org OS X 安装程序是兼容的) OS X 10.4 到 10.6)。
Distutils 允许您以独立于机器和操作系统的方式打包和分发纯 Python 和 C 扩展模块的组合。在许多情况下,如果编写 C 代码以避免依赖于操作系统的系统调用等,则可以在大多数当前 Python 平台上构建和安装 C 扩展而无需修改,也无需知道使用哪个 C 编译器或选项放。
您会发现几乎所有带有 C 代码的现代 Python 第三方包都以这种方式工作,因此最好从一开始就养成使用 Distutils 的习惯。
setup.py
正如您将在本教程中看到的,在许多情况下设置文件非常容易。
您可以通过多种方式编写 python 扩展,包括 Cython、SWIG、boost.python ......您还可以编写共享库并使用“ctypes”库来访问它。
有不同的方法可以做到这一点:
Python.h
C
在代码中使用标题。这会产生最快的代码。