Python Fire实战:在Ubuntu 22.04上轻松构建CLI工具

简介

Python Fire是一个Python库,它允许你从Python对象中自动创建命令行界面(CLIs)。CLIs是从命令行接受文本输入的程序,并且对于开发和调试的工作流程非常有帮助。对于那些更习惯于使用Bash和命令行的人来说,这非常有用。

尽管传统方法中使用标准Python库的argparse也可以完成相同的任务,但使用Python Fire可以显著提高原型设计和维护效率。如果您想要完全控制,可以查看这个关于如何在Python中使用argparse编写命令行程序的教程。

在这个教程中,你将安装Python Fire,并使用它来创建自定义的命令行界面(CLI)。这些CLI可以在不需要修改Python源代码的情况下创建。或者,对于更精细的脚本,可以直接与你的函数和类进行关联,你可以导入Python Fire并在代码本身中使用它。

前提条件

  • An Ubuntu 22.04 server, set up according to our initial server setup guide for Ubuntu 22.04, with a non-root user with sudo privileges and a firewall enabled.
  • The latest version of Python 3 installed on your machine with a virtual environment created, following how to install Python 3 and set up a programming environment on an Ubuntu 22.04 server.
  • An familiarity with the Python language and how to code in it. A good primer would be this series on how to code in Python 3.

步骤1 – 安装Python Fire

Python Fire托管在PyPI上,并可通过pip安装。在安装Python 3的前提条件后,您应该创建并启用虚拟环境。如果未启用,请转到您的环境目录。

  1. cd environments

然后启用您的虚拟环境。

  1. source my_env/bin/activate

这可以确保您的fire安装不会影响全局pip安装。另外,全局级别的pip安装可能会与apt等软件包管理器产生不可预测的交互。在启用虚拟环境的情况下,安装fire。

  1. pip install fire

火可以以多种方式被调用,包括在命令行中,无需在您的Python程序中添加任何代码。接下来,您将了解到这种方法,也会探索将Python Fire添加到您的实际代码中以实现更细粒度的控制的传统用法。

第二步:无需添加代码创建CLI程序。

首先,创建你的Python文件。可以把它称为文件、程序或脚本,所有这些称呼都是正确的。

要创建你的新文件,可以使用nano或你喜欢的文本编辑器。

  1. nano example.py

将以下Python代码插入到您的新文件中。

示例.py

def my_name(name):
  return "My name is {name}".format(name=name)

保存并退出您的文件。在nano中,您可以通过按下CTRL+O然后CTRL+X来完成这个操作。

这是一个名为my_name的Python函数,它接受一个名为name的参数。调用该函数并传入所需的变量将使用Python的字符串格式化将该变量插入到一个句子中。如果您在Python解释器中执行此代码,并将变量设置为sammy,则输出将为“我的名字是sammy”。

使用Python Fire,您可以将现有的Python代码转换为CLI命令,并在插入变量的同时执行此代码,而无需编写调用它的Python代码。使用-m将其作为Python模块调用,输入您的新CLI命令:

  1. python -m fire example my_name --name=sammy
OutputMy name is sammy

在这里,您将Python程序指定为要执行的示例,其中my_name是您要特定运行的函数。由于my_name是一个需要一个名为name的参数的函数,您可以使用–name标志提供该参数。

在不修改你的Python代码的情况下,你已经构建了一个基本的、可工作的命令行界面。

第三步 – 从导入了fire的程序中创建一个CLI

在使用Python Fire的更常规方法是将fire导入到您的代码中。这样可以更精细地控制代码,并在命令行界面中更复杂地构建代码。

打开你的example.py文件,然后插入以下代码:

例子.py

import fire

def my_name(name):
  return "My name is {name}".format(name=name)

if __name__ == '__main__':
  fire.Fire()

原始代码有两个值得注意的改变。首先,在开头导入了fire模块。然后在最后调用了fire.Fire()函数,这使得命令行界面功能得以开启。当用户直接运行Python程序时,这个调用会生效,但当该文件被导入到另一个Python脚本中时,它将不会执行。my_name函数本身没有变化。

保存并退出文件。

现在,您可以通过输入这个命令来使用您的命令行界面。

  1. python example.py my_name sammy
OutputMy name is sammy

因为火现在在您的Python代码中被导入到开头,所以您不再需要通过python -m在命令中调用火模块。 相反,您可以直接通过文件调用命令行界面,并为函数名称和变量提供参数。

这会提供更干净的命令行界面体验,但需要对您的实际代码进行修改。接下来,您将直接从一个函数创建一个命令行界面,而不是整个Python程序。

第四步 — 从函数创建一个命令行界面

不必将程序中的所有功能都暴露给命令行界面(CLI),你可以选择从特定的功能中创建一个CLI。将以下内容插入到你的示例.py文件中。

示例.py的英文是example.py。
import fire

def my_name(name):
  return "My name is {name}".format(name=name)

def my_full_name(first_name, last_name):
    return "My name is {first_name} {last_name}".format(first_name=first_name, last_name=last_name)

if __name__ == '__main__':
  fire.Fire(my_name)

保存并退出您的文件。

这次有两个函数。一个是原来的my_name函数,现在还有一个新的my_full_name函数。my_full_name函数有点不同,它接受两个参数,而Python Fire具备灵活性以允许这样的操作。它将在本教程后面使用。

此外,在最后调用fire.Fire时,现在需要一个参数。为了指定你想要使用的函数,你需要将它作为参数传递。在这个示例中,my_name将是你为CLI选择的目标。

因为你在命令行界面中指定了要使用的函数,所以你只需要提供执行该函数所需的程序和参数。

  1. python 示例.py sammy
输出My name is sammy

请注意,在输出中,只有my_name函数被返回,正如您所指定的那样。新的my_full_name函数保持不变。

然而,您可以为您的命令行界面(CLI)提供多个功能。为此,请将一个Python字典传递给fire.Fire调用。使用字典作为键值数据结构,可以指定多个函数用于您的CLI。该字典将包含所有您想在CLI中使用的函数。将以下内容插入示例.py文件中:

下面是一个例子: 示例.py
import fire

def my_name(name):
  return "My name is {name}".format(name=name)

def my_full_name(first_name, last_name):
    return "My name is {first_name} {last_name}".format(first_name=first_name, last_name=last_name)

if __name__ == '__main__':
  fire.Fire({
      'my_name': my_name,
      'my_full_name': my_full_name,
  })

现在你可以通过命令行界面调用第一个函数了。

  1. python 示例.py my_name sammy
输出My name is sammy

或者你可以将你的第二个函数命名为:

  1. python 示例.py my_full_name sammy shark
输出My name is sammy shark

这是文章《如何在Ubuntu 22.04上使用Python Fire创建CLI工具》的第3部分(共3部分)。

内容片段: 我的名字是sammy shark

这次的一个变化是字典的传递。有了这个字典,你可以从命令行界面 (CLI) 调用任何一个函数。接下来,你将会使用 Python 类创建一个 CLI,而不是一个函数。

第五步 — 从一个类创建一个命令行界面

你如何组织你的代码,无论是用类还是仅使用函数,都是一种偏好和个人遵循最佳实践的问题。使用Python Fire从类创建一个CLI与使用函数并没有很大的区别。

为了创建一个类,你需要重新组织你的代码,并将函数放置在类中作为其一部分。将以下内容插入到example.py中。

例子.py

import fire

class Namer(object):
    def my_name(self, name):
        return "My name is {name}".format(name=name)

    def my_full_name(self, first_name, last_name):
        return "My name is {first_name} {last_name}".format(first_name=first_name, last_name=last_name)

if __name__ == '__main__':
  fire.Fire(Namer)

现在,尽管通过重构代码使用类,你仍可以使用前一步骤中的相同命令通过CLI调用第一个函数。

  1. python example.py my_name sammy
输出My name is sammy

你也可以调用你的第二个函数:

  1. python example.py my_full_name sammy shark
输出My name is sammy shark

创建的CLI在功能上与之前的步骤完全相同,使用完全相同的命令。fire.Fire的调用也是一样的。唯一改变的是代码的重构,使用了类。

Python Fire 可根据您的喜好进行适应,允许您通过使用类或常规函数来编写代码。

结论

在本教程中,您已经安装了Python Fire,并通过Python程序、函数和类探索了多种创建自定义CLI的方法。如果想深入了解,请查阅官方文档。如果想尝试使用其他方法来创建Python命令行界面,请参考如何使用argparse编写Python命令行程序的指南。

bannerAds