Digital Studium

Блог о Linux, DevOps и облачных технологиях

🌐 English

Digital Studium Digital Studium Digital Studium

Python: Как легко написать CLI инструмент для Linux с помощью Fire


🧘 Автор: Константин Шуткин

Хочу поделиться самым простым из известных мне способов написать CLI инструмент для администрирования Linux на Python.

Шаг 1. Установка Fire

pip install fire

Шаг 2. Создаём простейший CLI инструмент

Вот пример CLI инструмента, который выводит в терминал версию Linux:

#!/usr/bin/env python3
import fire
import platform


class SysInfo:
    """A CLI tool for getting system information about Linux server"""

    def kernel(self):
        """A method for getting kernel version"""
        version = platform.release()
        return f"Kernel version: {version}"


if __name__ == "__main__":
    obj = SysInfo()
    fire.Fire(obj)

Вставьте этот код в файл с именем my-cli-tool и дайте права на выполнение:

chmod +x my-cli-tool

Затем положите этот файл по пути /usr/local/bin:

sudo cp ./my-cli-tool /usr/local/bin

Чтобы воспользоваться этим инструментом, достаточно набрать команду:

my-cli-tool kernel

Вы увидите такой вывод:

❯ my-cli-tool kernel
Kernel version: 6.2.2-060202-generic

Как видите, достаточно создать класс, метод(ы) в нём, и передать объект класса внутрь функции fire.Fire() - и cli инструмент готов! При этом автоматически сгенерируется help страница, вызвать которую можно с помощью флага --help:

my-cli-tool --help

Вы получите такой вывод:

NAME
    my-cli-tool - A CLI tool for getting system information about Linux server

SYNOPSIS
    my-cli-tool COMMAND

DESCRIPTION
    A CLI tool for getting system information about Linux server

COMMANDS
    COMMAND is one of the following:
      kernel
        A method for getting kernel version

Шаг 3. Усложняем инструмент

Например, мы хотим также, чтобы наш инструмент мог выводить версию ядра в коротком варианте, то есть так: 6.2.2. Переписываем код следующим образом:

#!/usr/bin/env python3
import fire
import platform


class SysInfo:
    """A CLI tool for getting system information about Linux server"""

    def kernel(self, format: ("short", "full") = "full"):
        """A method for getting kernel version"""
        version = platform.release()
        if format == "short":
            return version.split("-")[0]
        return f"Kernel version: {version}"


if __name__ == "__main__":
    obj = SysInfo()
    fire.Fire(obj)

Теперь мы можем набрать такую команду:

my-cli-tool kernel --format short

На что должен последовать такой вывод:

6.2.2

При этом автоматически будет скорректирована help страница, туда будет добавлен флаг --format и его возможные значения:

my-cli-tool kernel --help

Вывод:

NAME
    my-cli-tool kernel - A method for getting kernel version

SYNOPSIS
    my-cli-tool kernel <flags>

DESCRIPTION
    A method for getting kernel version

FLAGS
    -f, --format=FORMAT
        Type: ('short', 'full')
        Default: 'full'

Шаг 4. Создаём бинарный файл

Сначала устанавливаем pyinstaller:

pip install pytinstaller

Затем запускаем команду:

pyinstaller my-cli-tool --onefile

У вас должна появиться папка dist, а в ней файл бинарный my-cli-tool со всеми зависимостями, который можно использовать даже на серверах, на которых не установлен python или fire. Просто кладём этот файл по пути /usr/local/bin и my-cli-tool можно использовать!