如何从C或C++代码创建可被Python使用的.so文件

1 投票
5 回答
4958 浏览
提问于 2025-04-15 21:26

我在查看Python模块和Python框架中的"lib-dnyload"目录里的代码时,发现每当代码要创建某种图形界面或图形时,它都会导入一个后缀为.so的非Python文件。而在"lib-dnyload"里有很多这样的.so文件。

通过搜索,我发现这些文件叫做共享对象,它们是用C或C++编写的。我用的是Mac,并且使用GCC编译器。我想知道如何制作可以通过Python访问的共享对象文件。主要就是如何在Mac OS X上用GCC制作共享对象。

5 个回答

2

用Python构建和安装C扩展模块的标准方法是使用Python标准库中包含的Distutils。一般来说,这意味着你需要把C文件放在项目目录里,并创建一个配置文件,通常叫做setup.py,用来标识C源文件。通过在Python中运行一个配置好的setup.py文件,Distutils会利用你系统中的C编译器和链接器来处理C源文件的编译和链接。(在OS X上,你需要安装苹果免费的Xcode开发工具,它会安装gcc的版本。)现在,翻阅所有的Distutils文档来搞清楚该怎么做可能会让人感到不知所措。这里有一个简单的教程,应该能帮助你入门。

为什么要使用Distutils的setup.py而不是直接调用gcc呢?有几个原因:

  1. 因为C扩展通常是在Python解释器的上下文中运行的,所以确保扩展以与解释器中的C代码兼容的方式进行编译和链接是很重要的。Distutils会为你提供正确的选项,减少你需要猜测的部分。这在OS X上尤其重要,因为Python有多种版本,包括一些支持多种架构的可执行文件(比如-arch i386-arch ppc-arch x86_64-arch ppc64),以及支持多个OS X版本(例如,当前python.org的OS X安装程序兼容OS X 10.4到10.6)。

  2. Distutils允许你以与机器和操作系统无关的方式打包和分发纯Python和C扩展模块的组合。在很多情况下,如果C代码避免了依赖操作系统的系统调用等,你的C扩展可以在大多数当前的Python平台上构建和安装,而无需修改,也不需要你知道使用哪个C编译器或设置哪些选项。

  3. 你会发现几乎所有现代的Python第三方包中有C代码的都采用这种方式,所以从一开始就养成使用Distutils的习惯是很好的。

  4. 正如你在教程中看到的,对于很多情况,设置一个setup.py文件是非常简单的。

4

官方的Python文档从一个简单的例子开始。这对于初学者来说已经足够好了。

2

在我看来,最简单的方法就是使用 Cython。Cython 会为你生成一些 C 语言的代码,然后把这些代码编译成一个 ".so" 的库文件,这样你就可以在 Python 中加载它。这个过程简单又轻松。我建议你按照教程来操作,很快就能得到一个 so 库。

如果你想了解 Python 的 C 扩展背后的所有细节,可以去看看 关于 C 扩展的 Python 文档

撰写回答