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的前提条件后,您应该创建并启用虚拟环境。如果未启用,请转到您的环境目录。
- cd environments
然后启用您的虚拟环境。
- source my_env/bin/activate
这可以确保您的fire安装不会影响全局pip安装。另外,全局级别的pip安装可能会与apt等软件包管理器产生不可预测的交互。在启用虚拟环境的情况下,安装fire。
- pip install fire
火可以以多种方式被调用,包括在命令行中,无需在您的Python程序中添加任何代码。接下来,您将了解到这种方法,也会探索将Python Fire添加到您的实际代码中以实现更细粒度的控制的传统用法。
第二步:无需添加代码创建CLI程序。
首先,创建你的Python文件。可以把它称为文件、程序或脚本,所有这些称呼都是正确的。
要创建你的新文件,可以使用nano或你喜欢的文本编辑器。
- nano example.py
将以下Python代码插入到您的新文件中。
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命令:
- 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函数本身没有变化。
保存并退出文件。
现在,您可以通过输入这个命令来使用您的命令行界面。
- 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选择的目标。
因为你在命令行界面中指定了要使用的函数,所以你只需要提供执行该函数所需的程序和参数。
- 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,
})
现在你可以通过命令行界面调用第一个函数了。
- python 示例.py my_name sammy
输出My name is sammy
或者你可以将你的第二个函数命名为:
- 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调用第一个函数。
- python example.py my_name sammy
输出My name is sammy
你也可以调用你的第二个函数:
- 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命令行程序的指南。