如何使用autotools构建Python C扩展模块

7 投票
2 回答
2804 浏览
提问于 2025-04-11 09:32

大部分关于如何构建Python扩展模块的文档都是使用distutils这个工具,但我想用合适的python autoconf和automake宏来实现这个目标。

我想知道有没有开源项目正好是这样做的。我找到的大多数项目最终还是依赖于一个setup.py文件。虽然这种方法可以用,但不幸的是,每次我修改模块的源文件时,它都会重新构建整个源代码树。

2 个回答

14

假设你有一个项目,里面有一个叫做 src 的文件夹。接下来,我们来看看如何使用 autotools 来构建和打包一个 Python 扩展。

创建 Makefile.am 文件

首先,你需要在项目的根目录下创建一个 Makefile.am 文件,基本上(但不局限于)列出需要处理的子目录。最终你会得到类似这样的内容:

SUBDIRS = src

第二个文件需要放在 src 目录下,这个文件会包含实际编译你的 Python 扩展的指令。它的内容大概是这样的:

myextdir = $(pkgpythondir)
myext_PYTHON = file1.py file2.py

pyexec_LTLIBRARIES = _myext.la

_myext_la_SOURCES = myext.cpp
_myext_la_CPPFLAGS = $(PYTHON_CFLAGS)
_myext_la_LDFLAGS = -module -avoid-version -export-symbols-regex initmyext
_myext_la_LIBADD = $(top_builddir)/lib/libhollow.la

EXTRA_DIST = myext.h

编写 configure.ac 文件

这个文件必须在项目的根目录下创建,并且需要列出你项目构建所需的所有库、程序或工具,比如编译器、链接器、库等等。

像我这样懒的人,通常不喜欢从头开始创建这个文件,我更喜欢使用 autoscan 工具,它会查找你正在使用的东西,并生成一个 configure.scan 文件,这个文件可以作为你真正的 configure.ac 的基础。

为了告诉 automake 你需要 Python 的相关内容,你可以在 configure.ac 文件中添加以下内容:

dnl python checks (you can change the required python version bellow)
AM_PATH_PYTHON(2.7.0)
PY_PREFIX=`$PYTHON -c 'import sys ; print sys.prefix'`
PYTHON_LIBS="-lpython$PYTHON_VERSION"
PYTHON_CFLAGS="-I$PY_PREFIX/include/python$PYTHON_VERSION"
AC_SUBST([PYTHON_LIBS])
AC_SUBST([PYTHON_CFLAGS])

总结

基本上,automake 内置了一个扩展,它知道如何处理 Python 的相关内容。你只需要把它添加到你的 configure.ac 文件中,然后在你的 Makefile.am 中利用这个功能。

PyGtk 是一个很棒的例子,但它比较大,所以你可能想看看其他项目,比如 Guake

4

所有的PyGTK扩展都使用一种叫做autotools的工具,所以如果PyGTK的部分没有让你觉得太复杂的话,可以看看这个PyGTK的源代码。另外,这里有一个我写的更简单的版本,你可以看看。

撰写回答