如何从C或C++代码创建可被Python使用的.so文件
我在查看Python模块和Python框架中的"lib-dnyload"目录里的代码时,发现每当代码要创建某种图形界面或图形时,它都会导入一个后缀为.so的非Python文件。而在"lib-dnyload"里有很多这样的.so文件。
通过搜索,我发现这些文件叫做共享对象,它们是用C或C++编写的。我用的是Mac,并且使用GCC编译器。我想知道如何制作可以通过Python访问的共享对象文件。主要就是如何在Mac OS X上用GCC制作共享对象。
5 个回答
用Python构建和安装C扩展模块的标准方法是使用Python标准库中包含的Distutils。一般来说,这意味着你需要把C文件放在项目目录里,并创建一个配置文件,通常叫做setup.py
,用来标识C源文件。通过在Python中运行一个配置好的setup.py
文件,Distutils
会利用你系统中的C编译器和链接器来处理C源文件的编译和链接。(在OS X上,你需要安装苹果免费的Xcode
开发工具,它会安装gcc
的版本。)现在,翻阅所有的Distutils文档来搞清楚该怎么做可能会让人感到不知所措。这里有一个简单的教程,应该能帮助你入门。
为什么要使用Distutils的setup.py
而不是直接调用gcc呢?有几个原因:
因为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)。Distutils允许你以与机器和操作系统无关的方式打包和分发纯Python和C扩展模块的组合。在很多情况下,如果C代码避免了依赖操作系统的系统调用等,你的C扩展可以在大多数当前的Python平台上构建和安装,而无需修改,也不需要你知道使用哪个C编译器或设置哪些选项。
你会发现几乎所有现代的Python第三方包中有C代码的都采用这种方式,所以从一开始就养成使用Distutils的习惯是很好的。
正如你在教程中看到的,对于很多情况,设置一个
setup.py
文件是非常简单的。
官方的Python文档从一个简单的例子开始。这对于初学者来说已经足够好了。
在我看来,最简单的方法就是使用 Cython。Cython 会为你生成一些 C 语言的代码,然后把这些代码编译成一个 ".so" 的库文件,这样你就可以在 Python 中加载它。这个过程简单又轻松。我建议你按照教程来操作,很快就能得到一个 so 库。
如果你想了解 Python 的 C 扩展背后的所有细节,可以去看看 关于 C 扩展的 Python 文档。