Как создавать модули расширения Python C с помощью autotools

Большая часть документации, доступной для создания модулей расширения Python использует distutils, но я хотел бы добиться этого, используя соответствующий python autoconf и макросы automake вместо этого.

Я хотел бы знать, есть ли проект с открытым исходным кодом, который именно это. Большинство из найденных мной в конечном итоге полагаются на файл setup.py. Использование этого подхода работает, но, к сожалению, приводит к перестройке всего дерево исходных текстов каждый раз, когда я вношу изменения в исходные файлы модуля.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
2 541
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Все расширения PyGTK используют автоинструменты, поэтому, если аспекты PyGTK не убивают все за вас, возможно, стоит взглянуть на Исходный код PyGTK. Дополнительно вот один из написанных мною более простой.

Предположим, у вас есть проект с каталогом 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

Напишите 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.

Другие вопросы по теме