Введение
Автоматизация рутинных задач — неотъемлемая часть разработки. Будь то сборка проекта, деплой, форматирование кода или выполнение миграций — всё это лучше доверить инструменту. Для Python таким инструментом выступает Invoke.
Invoke — это библиотека для создания утилит командной строки с возможностью описания задач в Python-функциях. Она предоставляет простой, но мощный способ организовывать автоматизированные команды, близкий к make
или Fabric
, но написанный в чистом Python.
В этой статье вы узнаете всё: как устроен Invoke, как использовать его API, как писать задачи и управлять параметрами CLI, какие методы доступны и как применить библиотеку в реальных проектах.
Основная часть
Что такое Invoke
Invoke — это Python-библиотека для описания и выполнения задач в стиле командной строки. Она была выделена из Fabric 2 как отдельный компонент для построения CLI-интерфейсов и автоматизации.
Ключевые особенности
-
Написание задач в виде Python-функций
-
Автоматическое создание CLI на основе кода
-
Поддержка аргументов, опций и
help
-
Встроенная работа с shell-командами
-
Гибкая конфигурация и namespace'ы
Установка
pip install invoke
После установки доступна команда inv
, аналог make
, но на Python.
Структура задач и базовый синтаксис
Простейший пример
from invoke import task
@task
def hello(c):
print("Hello, world!")
Запуск:
inv hello
Объект Context
Каждая задача принимает объект Context
(обычно c
), через который можно вызывать shell-команды:
@task
def build(c):
c.run("python setup.py sdist")
Декоратор @task
Используется для обозначения функции как CLI-задачи. Поддерживает аргументы:
@task(help={"name": "Имя пользователя"})
def greet(c, name="Anon"):
print(f"Hello, {name}!")
Запуск:
inv greet --name=Ivan
Аргументы и опции
Обязательные аргументы
@task
def say(c, word):
print(word)
inv say --word=Hi
Опциональные аргументы
@task
def ping(c, count=1):
for _ in range(count):
print("pong")
Флаги и типы
@task
def debug(c, verbose=False):
if verbose:
print("Verbose mode on")
inv debug --verbose
Группировка задач через Collection
Можно группировать задачи в коллекции:
from invoke import Collection
ns = Collection()
ns.add_task(hello)
ns.add_task(build)
Или в подмодули:
ns = Collection.from_module(my_module)
Конфигурация проекта
invoke.yaml
Конфигурация хранится в YAML-файле:
run:
echo: true
pty: true
Можно переопределять параметры задач, передав настройки через Config
:
from invoke import Config
config = Config(overrides={"run": {"echo": True}})
Методы класса Context
Метод | Описание |
---|---|
run(cmd) |
Выполняет команду в shell |
sudo(cmd) |
Выполняет команду с правами root |
cd(path) |
Контекстный переход в директорию |
prefix(cmd) |
Выполняет команду-префикс |
Пример prefix
with c.prefix("source venv/bin/activate"):
c.run("python script.py")
Обработка ошибок
result = c.run("exit 1", warn=True)
print(result.ok)
Управление выводом
c.run("ls", hide=True)
Продвинутые сценарии
CI/CD задачи
@task
def deploy(c):
c.run("git pull")
c.run("systemctl restart app")
Сборка и тесты
@task
def test(c):
c.run("pytest --cov")
Компоновка задач
@task(pre=[build, test])
def all(c):
print("All steps done")
Использование в проектах
DevOps-скрипты
Интеграция с Fabric и Paramiko для деплоя.
Backend Dev
Обёртки над Docker, запуск миграций, линтеров и тестов.
Data Science
Автоматизация очистки данных, обучения моделей, генерации отчётов.
Сравнение с аналогами
Инструмент | Язык | Поддержка CLI | Сложность | Подходит для |
Invoke | Python | Да | Низкая | Скрипты, DevOps |
Makefile | DSL | Частично | Средняя | Сборка проектов |
Fabric | Python | Да | Средняя | SSH-автоматизация |
Bash | Shell | Да | Средняя | Любые задачи |
Основные модули Invoke
-
@task
– декоратор для определения задач. -
Context
(c
) – контекст выполнения команд. -
Runner
– запуск команд. -
Config
– управление конфигурацией. -
Program
– CLI-интерфейс для задач.
1. @task
– определение задач
Декоратор для создания задач, которые можно вызывать через CLI.
Основные параметры
Параметр | Описание |
---|---|
name |
Имя задачи (по умолчанию – имя функции). |
aliases |
Список альтернативных имён. |
help |
Описание задачи (показывается в --help ). |
default |
Если True , задача выполняется по умолчанию (при вызове без аргументов). |
Пример
from invoke import task @task(help={'name': 'Имя для приветствия'}) def hello(c, name="World"): print(f"Hello, {name}!")
Запуск:
inv hello --name=Alice
2. Context
(c
) – выполнение команд
Объект c
(контекст) передаётся в каждую задачу и используется для выполнения команд.
Основные методы
Метод | Описание |
---|---|
run(command, **kwargs) |
Выполняет shell-команду. |
sudo(command, **kwargs) |
Выполняет команду с sudo . |
cd(path) |
Контекстный менеджер для смены директории. |
prefix(command) |
Добавляет префикс ко всем командам в блоке. |
Пример
from invoke import task @task def deploy(c): with c.cd('/var/www/myapp'): c.run('git pull') c.run('pip install -r requirements.txt')
3. Runner
– запуск команд
Низкоуровневый класс для выполнения команд (используется внутри Context
).
Основные параметры
Параметр | Описание |
---|---|
hide |
Скрыть вывод (stdout , stderr , both ). |
warn |
Не вызывать исключение при ошибке. |
pty |
Использовать pseudo-terminal (PTY). |
echo |
Показывать команду перед выполнением. |
Пример
from invoke import Runner result = Runner().run('ls -la', hide=True) print(result.stdout)
4. Config
– управление конфигурацией
Настройки выполнения задач (аналогично fabric.Config
).
Основные параметры
Параметр | Описание |
---|---|
run.hide |
Скрыть вывод команд. |
run.warn |
Игнорировать ошибки. |
sudo.password |
Пароль для sudo . |
Пример
from invoke import Config, Context config = Config(overrides={'run': {'warn': True}}) ctx = Context(config=config) ctx.run('false') # Не вызывает исключение
5. Program
– CLI-интерфейс
Запуск задач из командной строки.
Основные параметры
Параметр | Описание |
---|---|
namespace |
Словарь задач. |
version |
Версия программы. |
name |
Имя программы (по умолчанию invoke ). |
Пример
from invoke import Program, task @task def build(c): c.run('make build') program = Program(namespace={'build': build})
Запуск:
python my_tasks.py build
6. Дополнительные утилиты
1. path()
– работа с путями
from invoke import task, Path @task def clean(c): build_dir = Path('build') if build_dir.exists(): build_dir.rmtree()
2. watchers
– автоматический перезапуск
from invoke import task @task def serve(c): c.run('python server.py', pty=True, watchers=[ lambda: c.run('make reload') # Перезапуск при изменении файлов ])
3. Parser
– разбор аргументов
from invoke import task, Parser @task def greet(c, name): print(f"Hello, {name}!") parser = Parser() parser.add_argument('--name', default='World') args = parser.parse_args() greet(None, args.name)
Пример tasks.py
from invoke import task @task def test(c): """Запуск тестов.""" c.run('pytest', pty=True) @task def lint(c): """Проверка стиля кода.""" c.run('flake8 .', warn=True) @task(default=True) def all(c): """Выполнить тесты и проверку стиля.""" test(c) lint(c)
Запуск:
inv test # Запуск тестов inv # Выполнит задачу `all` (по умолчанию)
Заключение
Invoke — простой, но мощный инструмент для построения CLI-интерфейсов и автоматизации процессов. Он позволяет писать удобные задачи в Python, избавляя от необходимости использовать bash-скрипты или make
. Благодаря поддержке аргументов, конфигураций, цепочек задач и интерактивных команд — это идеальный инструмент для разработки и деплоя.