Варианты установки пакета Python через setup.py
Установка пакета Python с setup.py
Наиболее эффективный способ установки пакета, содержащего файл setup.py, заключается в использовании менеджера пакетов pip в сочетании с командой pip install .. Этот подход автоматически обрабатывает зависимости, выполняет сборку и устанавливает пакет в текущее окружение. Например:
cd my_package_dir
pip install .Python build package (сборка пакета python)
Команда запускает setup.py через setuptools, гарантируя корректную установку. Рекомендуется выполнять установку внутри виртуального окружения, чтобы изолировать зависимости проекта.
Как установить пакет напрямую через python setup.py install?
Классический способ, который использовался до повсеместного внедрения pip. Выполняется из корня пакета:
python setup.py installPython download package (скачивание пакета python)
Типичные проблемы:
- Отсутствие setuptools: перед установкой необходимо установить
setuptools(обычно входит в состав Python, но может быть пропущено в минимальных сборках). Решение:pip install setuptools. - Ошибки компиляции C-расширений: часто возникают на Windows из-за отсутствия компилятора. Решение: установить
Microsoft Visual C++ Build Toolsили использовать заранее собранные wheel-файлы. - Конфликт версий зависимостей:
python setup.py installне проверяет совместимость зависимостей, что может нарушить работу других пакетов. Рекомендуется использоватьpip.
Цель использования: совместимость с устаревшими проектами или в средах, где pip недоступен.
Как установить пакет в режиме редактирования (develop)?
Режим разработки позволяет устанавливать пакет так, чтобы изменения в исходном коде немедленно применялись без повторной установки. Варианты:
python setup.py develop
pip install -e .Python pip install local package (установка локального пакета через pip)
Второй способ предпочтительнее, так как использует pip и корректно обрабатывает зависимости.
Возможные ошибки:
- Пути установки:
pip install -e .создает ссылку на каталог пакета. При перемещении каталога ссылка ломается. Решение: повторная установка. - Конфликт с уже установленной версией: Если пакет уже установлен глобально, может возникнуть путаница. Решение: использовать виртуальное окружение.
Цель: активная разработка пакета, когда требуется часто менять код и тестировать.
Как собрать и установить wheel (колесо)?
Сборка binary-распространения в формате .whl ускоряет установку на других машинах. Команды:
pip install wheel # установка сборщика
python setup.py bdist_wheel # создание .whl файла в папке dist/
pip install dist/my_package-*.whl # установка из wheelPython install package version (установка пакета определенной версии в python)
Проблемы:
- Платформозависимость: собранный wheel может не работать на других ОС. Решение: собирать wheel для каждой целевой платформы или использовать
manylinux. - Отсутствие зависимостей в wheel: зависимости не включаются в wheel, они указываются в
setup.py. При установкеpipскачает их отдельно.
Цель: распространение предварительно собранного пакета без необходимости компиляции на стороне пользователя.
Как установить пакет из репозитория Git?
Если пакет не опубликован на PyPI, его можно установить прямо из Git:
pip install git+https://github.com/user/repo.git
pip install git+https://github.com/user/repo.git@develop # установка из веткимодули python linux (модули python в linux)
Ошибки:
- Отсутствие Git: на машине должен быть установлен Git. Решение: установить Git или использовать ZIP-архив с
pip install https://...zip. - Проблемы с аутентификацией: для частных репозиториев требуется токен или SSH-ключ. Решение: настроить доступ.
Цель: установка последней версии пакета из репозитория без ручного клонирования.
Как применить все варианты в виртуальном окружении?
Перед любой установкой создается виртуальное окружение:
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
pip install . # установка пакета
Типичные ошибки:
- Не активированое окружение: пакет устанавливается глобально. Решение: проверить, что виртуальное окружение активно (по имени в приглашении командной строки).
- Права доступа: при установке глобально требуется
sudoна Linux. В виртуальном окружении права не нужны.
Цель: изоляция проекта от системных пакетов Python.
Расширенные примеры установки и сборки
Ниже приведены подробные примеры с кодом и выводом команд. Предполагается, что создан простой пакет со следующей структурой:
my_package/
setup.py
my_package/
__init__.py
module.py
Файл setup.py содержит:
from setuptools import setup, find_packages
setup(
name='my_package',
version='0.1.0',
packages=find_packages(),
install_requires=[
'requests>=2.25.0',
'numpy'
],
extras_require={
'dev': ['pytest', 'flake8'],
'doc': ['sphinx']
},
entry_points={
'console_scripts': [
'my_command=my_package.module:main'
]
}
)
Пример 1: установка с проверкой зависимостей.
$ cd my_package
$ pip install .
Processing /home/user/my_package
Installing build dependencies ... done
Getting requirements to build wheel ... done
Preparing metadata (pyproject.toml) ... done
Building wheels for collected packages: my-package
Building wheel for my-package (setup.py) ... done
Created wheel for my-package: my_package-0.1.0-py3-none-any.whl
Stored in directory: /tmp/pip-ephem-wheel-cache-...
Successfully built my_package
Installing collected packages: my-package
Successfully installed my-package-0.1.0
$ python -c "import my_package; print(my_package.__version__)" 0.1.0
Пример 2: установка в режиме редактирования (editable).
$ pip install -e .
Obtaining file:///home/user/my_package
Installing build dependencies ... done
Getting requirements to build wheel ... done
Preparing metadata (pyproject.toml) ... done
Installing collected packages: my-package
Running setup.py develop for my-package
Successfully installed my-package
$ python -c "import my_package; print(my_package.module.some_value)" 42
После изменения кода в module.py перезапуск программы подхватит изменения без повторного запуска pip install.
Пример 3: сборка wheel и установка из него.
$ pip install wheel
Collecting wheel
Using cached wheel-0.42.0-py3-none-any.whl
Installing collected packages: wheel
Successfully installed wheel-0.42.0
$ python setup.py bdist_wheel
running bdist_wheel
running build
...
creating dist
Successfully built my_package-0.1.0-py3-none-any.whl
$ pip install dist/my_package-0.1.0-py3-none-any.whl
Processing ./dist/my_package-0.1.0-py3-none-any.whl
Installing collected packages: my-package
Successfully installed my-package-0.1.0
$ my_command Hello from my_package
Консольная команда my_command автоматически добавлена благодаря entry_points.
Пример 4: установка с дополнительными зависимостями (extras).
$ pip install .[dev]
Processing /home/user/my_package
Installing build dependencies ... done
Getting requirements to build wheel ... done
Preparing metadata (pyproject.toml) ... done
Building wheels for collected packages: my-package
...
Successfully built my-package
Installing collected packages: my-package, pytest, flake8
Successfully installed flake8-7.0.0 my-package-0.1.0 pytest-8.0.0
Будут установлены пакеты pytest и flake8 вместе с основным пакетом.
Пример 5: установка из Git с указанием ветки.
$ pip install git+https://github.com/example/api-wrapper.git@v2.0
Collecting api-wrapper from git+https://github.com/example/api-wrapper.git@v2.0
Cloning https://github.com/example/api-wrapper.git (to revision v2.0) ...
Running setup.py install for api-wrapper ... done
Successfully installed api-wrapper-2.0
$ python -c "import api_wrapper; print(api_wrapper.__version__)" 2.0
Пример 6: создание бинарного wheel с платформенной зависимостью (C-расширение).
# setup.py с C-расширением
from setuptools import setup, Extension
module = Extension('my_c_module', sources=['src/my_c_module.c'])
setup(
name='my_c_package',
version='0.1.0',
ext_modules=[module],
)
$ pip install .
...
Building wheel for my-c-package (setup.py) ... done
Successfully installed my-c-package-0.1.0
$ python -c "import my_c_module; print(my_c_module.add(1,2))" 3
При ошибке компиляции на Windows будет выведено сообщение об отсутствии компилятора. Решение - установить Microsoft C++ Build Tools и перезапустить команду.
Пример 7: использование data_files для установки конфигурационных файлов.
# setup.py
from setuptools import setup
setup(
name='my_app',
version='0.1.0',
packages=['my_app'],
data_files=[
('etc', ['config/default.conf'])
]
)
$ pip install .
$ python -c "import os; print(os.path.exists('/path/to/etc/default.conf'))"
True
Путь назначения (etc) может зависеть от ОС. На современных версиях setuptools рекомендуется использовать package_data или include_package_data=True.