Применение make install в процессе установки Python пакетов

Раздел: Управление проектами -> Пакеты

Основные подходы к установке через make install

Как выполнить установку Python пакета с помощью make install, если проект использует Makefile?

Наиболее эффективным решением является создание Makefile, который делегирует установку современному инструменту pip. Такой подход обеспечивает автоматическое разрешение зависимостей и корректную установку в текущее окружение. Пример простого Makefile:


# Makefile для Python пакета
install:
	pip install . --upgrade

.PHONY: install

Pip upgrade package python (обновление пакета через pip)

Выполнение команды make install запустит pip install . , что установит пакет из текущей директории с обновлением зависимостей. Если требуется установка в режиме разработки, можно использовать pip install -e . или добавить отдельную цель develop.

Типичные проблемы и их решение:

  • Ошибка «make: команда не найдена» - установите make через пакетный менеджер (apt install make, yum install make).
  • Permission denied при установке - используйте флаг --user либо установку в виртуальное окружение.
  • Отсутствие setup.py или pyproject.toml - убедитесь, что пакет упакован стандартным образом. Если проект использует только make, необходимо вручную копировать файлы в site-packages.

Как установить пакет без pip, используя только setup.py?

В старых проектах или при отсутствии pip может применяться команда python setup.py install. Однако этот метод считается устаревшим, так как не учитывает зависимости и не поддерживает установку в изолированные окружения. Пример Makefile:


install:
	python setup.py install

Python pip update package (обновление пакета через pip update)

Вызов make install выполнит установку, но для обновления зависимостей потребуется дополнительная цель.

Проблемы:

  • Команда может требовать права root при установке в системную директорию.
  • Отсутствует автоматическое разрешение зависимостей - их нужно устанавливать отдельно.
  • При повторной установке может возникнуть конфликт версий.

Как собрать C-расширение вручную через make install?

Если пакет содержит нативный код на C/C++, сборка может выполняться через make перед установкой. Тогда Makefile сначала компилирует расширение, а затем копирует полученный .so файл в site-packages. Пример:


# Makefile для сборки модуля example
CC=gcc
CFLAGS=-fPIC -I/usr/include/python3.10
LDFLAGS=-shared

all: example.so

example.so: example.c
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^

install:
	cp example.so $(shell python3 -c "import site; print(site.getsitepackages()[0])")

clean:
	rm -f example.so

Python build package (сборка пакета python)

Как обеспечить совместимость с разными версиями Python?

Используйте переменные окружения или динамическое определение путей. Например, определите PYTHON_INCLUDE через python-config. В Makefile можно добавить:


PYTHON_INCLUDE := $(shell python3-config --includes)

Python download package (скачивание пакета python)

Возможные ошибки:

  • Файл .so не загружается - проверьте, что библиотека скомпилирована для той же версии Python.
  • Отсутствует python3-config - установите пакет python3-dev или python3-devel.

Как использовать системный make install для Python пакета как части крупного проекта?

В проектах с autotools или cmake Python модуль может устанавливаться вместе с остальными компонентами. Например, cmake поддерживает установку Python-модулей через install(TARGETS ...) или install(FILES ...). Типичный Makefile.generated после cmake будет содержать цель install, которая размещает файлы в нужные каталоги.


# Пример фрагмента CMakeLists.txt
install(TARGETS my_python_module DESTINATION ${PYTHON_SITE_PACKAGES})

Сложности:

  • Необходимо правильно задать PYTHON_SITE_PACKAGES, иначе модуль будет установлен в неожиданное место.
  • Переопределение пути через cmake -DCMAKE_INSTALL_PREFIX может повлиять на расположение.
- модули python linux (модули python в linux)
- Update lib python (обновление библиотек python)
- Python packages list (список установленных пакетов)

Расширенные примеры использования make install с Python пакетами

Ниже приведены подробные примеры, демонстрирующие различные сценарии и тонкости настройки.

Пример 1: Makefile с поддержкой виртуального окружения

Пример

# Makefile для установки в venv
VENV = venv
PYTHON = $(VENV)/bin/python3
PIP = $(VENV)/bin/pip

$(VENV):
	python3 -m venv $(VENV)

install: $(VENV)
	$(PIP) install . --upgrade

develop: $(VENV)
	$(PIP) install -e .

clean:
	rm -rf $(VENV) build dist *.egg-info

.PHONY: install develop clean

Результат: при выполнении make install сначала создаётся виртуальное окружение (если отсутствует), затем пакет устанавливается в него. Это позволяет изолировать зависимости.

Пример 2: Сборка C-расширения с проверкой версии Python

Пример

# Makefile для модуля cexample
PYTHON = python3
PYTHON_VERSION := $(shell $(PYTHON) -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')")
PYTHON_INCLUDE := $(shell $(PYTHON)-config --includes 2>/dev/null || echo "-I/usr/include/python$(PYTHON_VERSION)")

all: cexample.so

cexample.so: cexample.c
	gcc -shared -fPIC $(PYTHON_INCLUDE) -o $@ $<

install:
	SITE_PACKAGES=$$($(PYTHON) -c "import site; print(site.getsitepackages()[0])"); \
	cp cexample.so $$SITE_PACKAGES/

clean:
	rm -f cexample.so

Результат: после make install файл cexample.so копируется в site-packages, и модуль становится доступен для импорта. При отсутствии python3-config используется стандартный путь.

Пример 3: Установка через pip с флагом --target

Пример

# Makefile для установки пакета в пользовательскую директорию
install:
	pip install . --target /path/to/custom/libs --no-deps

# Для установки с зависимостями в отдельную папку:
install-with-deps:
	pip install . --target /path/to/custom/libs

Результат: пакет и его зависимости устанавливаются в указанную директорию, что полезно для развёртывания приложений без прав root.

Пример 4: Сборка с помощью setuptools и make для распространения

Пример

# Makefile для создания дистрибутива и его установки
sdist:
	python setup.py sdist

install-from-sdist:
	pip install dist/*.tar.gz

.PHONY: sdist install-from-sdist

Результат: сначала создаётся tar-архив, затем он устанавливается через pip. Это гарантирует, что установка происходит из стабильной версии.

Пример 5: Makefile с поддержкой нескольких версий Python

Пример

# Makefile для установки под Python 2 и Python 3
PYTHON ?= python3
PIP ?= pip3

install:
	$(PIP) install . --upgrade

install2:
	python2 -m pip install . --upgrade

.PHONY: install install2

Результат: позволяет установить пакет для разных версий Python с помощью одной команды make install или make install2.

Установка Python пакета через make install - comments

En
Python make install (python)