1
0
Fork 0
digitalstudium.com/content/ru/python-lifehacks/how-to-easily-write-linux-c...

142 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "Python: Как легко написать CLI инструмент для Linux с помощью Fire"
category: python-lifehacks
filename: how-to-easily-write-linux-cli-tool
date: 2023-04-09
---
Хочу поделиться самым простым из известных мне способов написать CLI инструмент для администрирования Linux
на Python.
## Шаг 1. Установка Fire
```bash
pip install fire
```
## Шаг 2. Создаём простейший CLI инструмент
Вот пример CLI инструмента, который выводит в терминал версию Linux:
<!--more-->
```python
#!/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` и дайте права на выполнение:
```bash
chmod +x my-cli-tool
```
Затем положите этот файл по пути `/usr/local/bin`:
```bash
sudo cp ./my-cli-tool /usr/local/bin
```
Чтобы воспользоваться этим инструментом, достаточно набрать команду:
```bash
my-cli-tool kernel
```
Вы увидите такой вывод:
```plaintext
my-cli-tool kernel
Kernel version: 6.2.2-060202-generic
```
Как видите, достаточно создать класс, метод(ы) в нём, и передать объект класса внутрь функции fire.Fire() - и cli инструмент готов!
При этом автоматически сгенерируется help страница, вызвать которую можно с помощью флага `--help`:
```bash
my-cli-tool --help
```
Вы получите такой вывод:
```plaintext
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`.
Переписываем код следующим образом:
```python
#!/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)
```
Теперь мы можем набрать такую команду:
```bash
my-cli-tool kernel --format short
```
На что должен последовать такой вывод:
```plaintext
6.2.2
```
При этом автоматически будет скорректирована help страница, туда будет добавлен флаг `--format` и его возможные значения:
```bash
my-cli-tool kernel --help
```
Вывод:
```plaintext
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`:
```bash
pip install pytinstaller
```
Затем запускаем команду:
```
pyinstaller my-cli-tool --onefile
```
У вас должна появиться папка `dist`, а в ней файл бинарный `my-cli-tool` со всеми зависимостями, который можно использовать даже на серверах,
на которых не установлен python или fire. Просто кладём этот файл по пути `/usr/local/bin` и `my-cli-tool` можно использовать!