Digital Studium

Blog about Linux, DevOps and cloud technologies

๐ŸŒ ะ ัƒััะบะธะน

Digital Studium

Python: How to easily write a CLI tool for Linux using Fire


๐Ÿง˜ By: Konstantin Shutkin

I want to share the easiest way I know to write a CLI tool for Linux administration using python and Fire.

Step 1: Install Fire

pip install fire

Step 2. Create a simple CLI tool

Here is an example of a CLI tool that prints the Linux version to the terminal:

#!/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)

Paste this code into a file called my-cli-tool and give it permission to execute:

chmod +x my-cli-tool

Then put this file in the path /usr/local/bin:

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

To use this tool, just type the command:

my-cli-tool kernel

You will see output like this:

โฏ my-cli-tool kernel
Kernel version: 6.2.2-060202-generic

As you can see, it is enough to create a class, a method(s) in it, and pass the class object to the fire.Fire() function - and the cli tool is ready! This will automatically generate a help page, which can be called using the --help flag:

my-cli-tool --help

You will get this output:

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

Step 3. Making the tool more complex

For example, we also want our tool to be able to print the kernel version in short form, like this: 6.2.2. We rewrite the code as follows:

#!/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)

Now we can type the following command:

my-cli-tool kernel --format short

Output:

6.2.2

This will also automatically update the help page, adding the --format flag and its possible values:

my-cli-tool kernel --help

Output:

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'

Step 4. Create a binary file

First install pyinstaller:

pip install pytinstaller

Then we run the command:

pyinstaller my-cli-tool --onefile

A folder dist should appear, and a binary file my-cli-tool inside it with all dependencies, which can be used even on servers, which do not have python or fire installed. Just put this file in the path /usr/local/bin and my-cli-tool can be used!