使用 python-fire 快速构建 CLI_如何搭建python项目架构
off999 2025-09-09 09:29 148 浏览 0 评论
命令行应用程序是开发人员最好的朋友。想快速完成某事?只需敲击几下键盘,您就已经拥有了想要的东西。
Python 是许多开发人员在需要快速组合某些东西时选择的第一语言。但是我们拼凑起来的东西在大多数时候并不是一个完整的 CLI,您需要管理标志、解析参数、链接子命令等等,这很麻烦,因此会产生多个小的和不受管理的脚本。
在今天的文章中,我们将结束这种情况,看看我们如何在几分钟内构建合理的功能丰富的 CLI,而无需任何花哨的装饰器或任何东西。
创建并激活虚拟环境
python -m venv venv
source venv/bin/activate
# Install python-fire
pip install fire复制
你的第一个子命令
我们的 CLI 应用程序将是一堆工具的集合,因此我们将其称为工具 CLI。
使用python-fire,您可以使用函数或类来创建子命令。但我发现使用类更加直观和易于管理。我们的第一个命令将是一个向我们显示 UTC 时间的子命令。
我们将创建一个新方法utc(),它将成为我们的子命令,我们有一个名为参数的参数pretty,它将作为我们的子命令的标志,以更易读的格式打印 UTC 日期时间。此参数已有默认值,因此这不是必需的标志。
# tools.py
from datetime import datetime
import fire
class Tools:
def utc(self, pretty: bool = False):
"""
Get UTC date time
"""
utc_time = datetime.utcnow()
if pretty:
## strftime format codes:
# https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes
print(utc_time.strftime("%B %d :: %H:%M %p"))
else:
print(utc_time)复制
接下来我们需要将此文件作为脚本运行,因此在文件末尾我们需要添加以下内容:
if __name__ == "__main__":
fire.Fire(Tools)复制
现在我们准备好了 CLI!让我们运行它!
python tools.py utc
python tools.py utc --pretty
# For help message
python tools.py
# For sub-command help message
python tools.py utc --help复制
打完所有这些开销有点让人不知所措python tools.py <command>;好吧,它甚至不像我希望的 CLI ♂。 您可能有以下问题:
- 我怎样才能从我想要的任何位置调用它?
- 我想将它命名为我觉得直观的东西,我该怎么做?
那么你会想要为它创建一个发行版。
命令行包
首先,我们需要稍微修改我们的程序以适应包装:
# REMOVE THIS CHUNK
if __name__ == "__main__":
fire.Fire(Tools)
# ADD THIS CHUNK
def run():
fire.Fire(Tools)复制
现在让我们创建一个setup.py文件来管理我们的打包/分发。您可以使用此文件作为参考来创建自己的 CLI:
# setup.py
"""Package setup"""
import setuptools
# Development Requirements
requirements_dev = ["pytest", "black", "mypy", "flake8", "isort"]
setuptools.setup(
name="tools_cli",
version="0.0.1",
author="Yankee Maharjan",
url="https://yankee.dev/build-cli-blazingly-fast-with-python-fire",
description="Collection of handy tools using CLI",
license="MIT",
packages=setuptools.find_packages(exclude=["dist", "build", "*.egg-info", "tests"]),
install_requires=["fire"],
extras_require={"dev": requirements_dev},
entry_points={"console_scripts": ["to = tools:run"]},
)复制
您需要在此处关注的行是entry_points,它将我们程序的入口点描述为控制台脚本。
entry_points={"console_scripts": ["to = tools:run"]},复制
这to是我们的 CLI 的名称,您可以将其命名为任何您喜欢的名称。如果你想给它命名,brr它会像这样:
entry_points={"console_scripts": ["brr = tools:run"]},复制
tools:run代表我们模块的名称,后跟它需要运行的功能。控制台脚本总是需要一个函数才能运行,因此我们之前进行了修改。
感觉像 CLI ♂
现在让我们在虚拟环境中以可编辑模式安装 CLI。这就像 CLI 的热重载,您所做的任何更改都会立即反映出来。
在您的项目目录中运行以下命令。
pip install -e .复制
现在你可以使用你的 CLI 使用命令to或你放在console_scripts上的任何东西
to utc
to utc --pretty
to utc --help复制
这很整洁!
现在我如何确保我可以从我想要的任何位置运行它?
- 停用您的虚拟环境: deactivate
- 在您的全局站点包上再次以可编辑模式安装项目: pip install -e .
现在完成了,您将可以在整个系统中访问您的 CLI。但请注意,如果您对主要 CLI 逻辑进行任何更改,它会立即反映出来。
奖励:嵌套命令
如果您已经做到这一点,那么您就可以制作自己的 CLI 并完成大部分用例。但如果你想看更多,那就多呆一会儿。
让我们向我们的工具添加其他命令,首先是一个名为leap()验证给定年份是否为闰年的子命令,最后是一个名为pw()生成强密码的子命令。
...
import calendar
import string
import secrets
class Tools:
def utc(self, ...):
...
def leap(self, year:int): # required: since no default value here
"""
Check if given year is leap or not
"""
print(calendar.isleap(year))
def pw(self, len: int = 16):
"""
Generate strong password
"""
alphabet = string.ascii_letters + string.digits + string.punctuation
pwd_length = len
pwd = ""
for i in range(pwd_length):
pwd += "".join(secrets.choice(alphabet))
print(pwd)
def run():
fire.Fire(Tools)复制
现在运行命令
to leap 2022
to pw
to pw --len 22
to pw 25复制
有时,您希望将一些相关的命令组合在一起,例如在我们的例子中,我们可以将utcand组合leap在类似datetime或dt简称的内容下。基本上我们在这里要做的是嵌套命令。
让我们对命令进行分组。我们将把我们的leap()和utc()方法移到一个名为DateTime.
...
class DateTime:
def utc(self, pretty: bool = False):
"""
Get UTC time
"""
from datetime import datetime
utc_time = datetime.utcnow()
if pretty:
print(utc_time.strftime("%B %d :: %H:%M %p"))
else:
print(utc_time)
def leap(self, year:int): # required: since no default value here
"""
Check if given year is leap or not
"""
print(calendar.isleap(year))
class Tools:
def __init__(self):
self.dt = DateTime()
def pw(self, ...):
...复制
子命令由我们在实例化新类时作为变量名放置的任何内容确定DateTime。这里我们将其命名为dt,但您可以将其命名为datetime,dtt或任何您想要的名称。
现在,我们的 CLI 有了更有条理的子命令。如果你想运行与日期时间相关的命令,你可以使用to dt <command-name>; 例如:
to dt utc
to dt leap 2025复制
密码命令将正常:
to pw
to pw --len 30复制
结论
使用 python-fire 使创建 CLI 的过程变得非常简单和直观,因为您只使用 Python 函数和类。我希望这个工具的简要概述以及如何打包它以供日常使用对您有所帮助。
相关推荐
- c盘100g剩多少才合适(c盘100g还剩30g够用吗)
-
够用。但前提是我们只能把C盘当做系统盘,一般系统(win10)只占30到个40g,加上一些系统运行缓存文件,C盘剩下的空间大概在40到50个g。所以说你的其他软件千万不能安装在C盘了,安装在D盘或者F...
- 腾讯电脑管家官网网址(腾讯电脑管家介绍)
-
就是正常的输入你路由器的账户密码,如果你的默认密码没有修改。那你可以看看你路由器底下,底下一般会有路由器的初始账号密码。首先需要使用数据线链接,手机完成匹配之后,使用WIFI链接,会随机刷出验证码。一...
- 免费下载qq2025新版本手机(下载qq2020最新版)
-
1/4找到QQ注册的官网进入官网2/4填写信息申请页面中需要填写昵称,密码,验证码及其他信息,然后点击确定即可。3/4登录QQ完成上一步之后,页面上会显示申请的QQ号码,和登录QQ按钮,点击登录QQ。...
- win10模拟器电脑版下载(win10模拟器正版)
-
在Windows10模拟器上下载应用程序,可以按照以下步骤进行操作:1.打开Windows10模拟器:在电脑上打开Windows10模拟器软件,如MicrosoftVisualStudio...
- 微星主板开机自动进入bios(微星主板开机自动进入bios怎么关闭)
-
原因:一是硬盘的问题,二是bios设置错误。1、现在新型的主板都有快速启动模式,需要硬盘的支持,而且他会装入特定主板驱动,以达到开机几秒,让客户觉得这电脑很牛叉。缺点就是,一旦驱动程序出问题,或者系统...
- 深度技术windows下载(深度技术系统官网win10)
-
要下载原神,您可以按照以下步骤进行操作。首先,打开您的手机应用商店(如AppStore或GooglePlay),在搜索栏中输入“原神”。然后,找到原神游戏应用,并点击“下载”按钮。等待下载完成后,...
- 鼠标指针图案可爱(鼠标指针图片素材)
-
鼠标箭头使用什么颜色好?让我们在使用鼠标的时候,我们发现鼠标进到的同城是个白色,如果你想设置的话,你可以根据你的界面来,如果你的界面底色是白色,那么你就可以使用显眼的黑色和红色都可以,然后你自己喜欢什...
- 企业级tplink初始账号和密码
-
tplink管理员初始密码是admin。需要注意的是只有老款的tplink路由器才有默认的初始密码,可以在tplink路由器的铭牌标签上查看到,而新款的tp-link路由器没有默认的初始密码了,登录密...
- 台式电脑无internet访问(电脑无法连接网络无internet访问)
-
检查本机,方法:ping本机ip或127.0.0.1,若ping同通,则本机网络正常。若ping不通,则考虑重新安装tcp/ip网络协议。检查网络,方法:ping网关,若ping通,则网络正常。若p...
- 华为平板电脑系统怎么重装(华为平板电脑重装系统步骤)
-
1、当平板电量耗尽,刚插上充电器时可能无法立即开机,请持续充电一段时间,再开机使用。2、可能是系统故障,可以使用华为系统恢复(eRecovery)恢复平板系统版本。具体步骤:a、通过USB数据线将...
- 电脑右下角输入法不见了怎么恢复
-
用快捷键win+R,打开“运行”对话框,输入命令“ctfmon.exe”,然后按回车键,输入法图标就能出现。具体操作如下:1、快捷键win+R打开“运行”对话框,输入命令“ctfmon.exe”,然后...
- 迈克菲卸载后还能安装吗(迈克菲卸载之后怎么安装)
-
win10迈克菲卸如果按照正常流程卸载是不会对计算机或系统产生任何影响的,迈克菲本身是微软旗下的一款杀毒软件,在正常关闭后卸载不会产生影响,若还在运行过程中进行卸载会导致计算机系统崩溃或者系统死机,...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
使用 python-fire 快速构建 CLI_如何搭建python项目架构
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
