Invoke – управление задачами

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

Автоматизация рутинных задач — неотъемлемая часть разработки. Будь то сборка проекта, деплой, форматирование кода или выполнение миграций — всё это лучше доверить инструменту. Для 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

  1. @task – декоратор для определения задач.

  2. Context (c) – контекст выполнения команд.

  3. Runner – запуск команд.

  4. Config – управление конфигурацией.

  5. Program – CLI-интерфейс для задач.


1. @task – определение задач

Декоратор для создания задач, которые можно вызывать через CLI.

Основные параметры

Параметр Описание
name Имя задачи (по умолчанию – имя функции).
aliases Список альтернативных имён.
help Описание задачи (показывается в --help).
default Если True, задача выполняется по умолчанию (при вызове без аргументов).

Пример

python
 
Copy
 
Download
from invoke import task

@task(help={'name': 'Имя для приветствия'})
def hello(c, name="World"):
    print(f"Hello, {name}!")

Запуск:

bash
 
Copy
 
Download
inv hello --name=Alice

2. Context (c) – выполнение команд

Объект c (контекст) передаётся в каждую задачу и используется для выполнения команд.

Основные методы

Метод Описание
run(command, **kwargs) Выполняет shell-команду.
sudo(command, **kwargs) Выполняет команду с sudo.
cd(path) Контекстный менеджер для смены директории.
prefix(command) Добавляет префикс ко всем командам в блоке.

Пример

python
 
Copy
 
Download
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 Скрыть вывод (stdoutstderrboth).
warn Не вызывать исключение при ошибке.
pty Использовать pseudo-terminal (PTY).
echo Показывать команду перед выполнением.

Пример

python
 
Copy
 
Download
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.

Пример

python
 
Copy
 
Download
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).

Пример

python
 
Copy
 
Download
from invoke import Program, task

@task
def build(c):
    c.run('make build')

program = Program(namespace={'build': build})

Запуск:

bash
 
Copy
 
Download
python my_tasks.py build

6. Дополнительные утилиты

1. path() – работа с путями

python
 
Copy
 
Download
from invoke import task, Path

@task
def clean(c):
    build_dir = Path('build')
    if build_dir.exists():
        build_dir.rmtree()

2. watchers – автоматический перезапуск

python
 
Copy
 
Download
from invoke import task

@task
def serve(c):
    c.run('python server.py', pty=True, watchers=[
        lambda: c.run('make reload')  # Перезапуск при изменении файлов
    ])

3. Parser – разбор аргументов

python
 
Copy
 
Download
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

python
 
Copy
 
Download
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)

Запуск:

bash
 
Copy
 
Download
inv test  # Запуск тестов
inv       # Выполнит задачу `all` (по умолчанию)

Заключение

Invoke — простой, но мощный инструмент для построения CLI-интерфейсов и автоматизации процессов. Он позволяет писать удобные задачи в Python, избавляя от необходимости использовать bash-скрипты или make. Благодаря поддержке аргументов, конфигураций, цепочек задач и интерактивных команд — это идеальный инструмент для разработки и деплоя.