命令行应用程序是开发人员最好的朋友。想快速完成某事?只需敲击几下键盘,您就已经拥有了想要的东西。
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
;好吧,它甚至不像我希望的 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
复制
有时,您希望将一些相关的命令组合在一起,例如在我们的例子中,我们可以将utc
and组合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
; 例如:
to dt utc
to dt leap 2025
复制
密码命令将正常:
to pw
to pw --len 30
复制
结论
使用 python-fire 使创建 CLI 的过程变得非常简单和直观,因为您只使用 Python 函数和类。我希望这个工具的简要概述以及如何打包它以供日常使用对您有所帮助。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
zjh@postgres=# create table hash_part_tab (id number,deal_date date,area_code number,nbr number,contents varchar2(4000)) zjh@postg…