如何使用autotools构建PythonC扩展模块
How to build Python C extension modules with autotools
可用于构建Python扩展模块的大多数文档使用distutils,但我希望通过使用适当的python autoconf&自动生成宏。
我想知道是否有一个开源项目正是这样。我发现的大多数最终都依赖于setup.py文件。使用这种方法是可行的,但不幸的是,最终会重建整个每当我对模块源文件进行修改时,都可以使用源树。
假设您有一个名为src
的目录的项目,那么让我们按照以下步骤使用自动工具构建和打包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
编写配置.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
所有PyGTK扩展都使用自动工具,因此,如果PyGTK方面不会对您造成影响,那么可能值得一看PyGTK源代码。另外,我写了一个更简单的例子。
- C++返回 Numpy 数组的 Python 扩展模块
- Python & C-C++ 扩展模块案例段故障
- 通过 cmake 从C++扩展构建 Python 子模块
- Python 和 C++ (Pybind11):Python 扩展模块导入错误
- boost.python模块扩展生成SIGSEGV
- 使用C 扩展Python/numpy,模块在初始化时崩溃
- Cython将扩展模块传递到to_py_call_code错误中的python reults
- OpenCV无法引用扩展模块
- 如何导入或安装预构建的Python扩展模块(C )(即未通过Setuptools编译的库)
- 如何有效地将 2d python 列表馈送到 c++ 扩展模块
- PHP 7 C++扩展名.找不到指定的模块
- Godot扩展C 模块与Android模块.有什么不同
- 在扩展模块中为用户定义的 python 类提升 Python to_python_converter
- 错误:distutils 扩展模块中'.hpp'未知文件类型
- 带有嵌入式 Python 的 Python 扩展模块调用了错误的库
- 带有SWIG的Python C++扩展-通过导入模块调用函数
- c++ API作为Python扩展模块
- Python扩展模块包结构(命名空间)
- 如何在boost:: Python扩展模块中正确组合c++和Python代码
- 如何使用autotools构建PythonC扩展模块