如何在 Python 中创建漂亮的命令行界面?

pythonserver side programmingprogramming更新于 2024/1/6 17:41:00

在本文中,我们将学习和探索如何在 Python 中创建漂亮的命令行界面。

首先,我们来谈谈 Python,然后再讨论命令行界面。

为什么是 Python?

Python 是一种流行的高级编程语言,以其简单性、可读性和多功能性而闻名。Python 由 Guido van Rossum 于 20 世纪 80 年代末创建,现已成为 Web 开发、科学计算、数据分析和机器学习领域最广泛使用的语言之一。

Python 的语法设计直观且易于理解,重点是减少表达给定任务所需的代码量。这使得它成为初学者以及想要快速制作原型或开发复杂应用程序的经验丰富的程序员的热门选择。

Python 是构建命令行界面 (CLI) 的热门选择,因为它是一种高级语言,具有清晰易读的语法,可以轻松编写和维护代码。Python 的广泛标准库包括支持构建 CLI 的模块,例如 argparse、click 和 docopt,它们提供易于使用且灵活的命令行参数解析和帮助消息生成。

此外,Python 是平台独立的,这意味着在一个平台上编写的代码可以轻松地在另一个平台上运行而无需进行任何修改。这使开发人员更容易编写可在多个操作系统(包括 Windows、Linux 和 macOS)上使用的跨平台命令行应用程序。

Python 还拥有一个庞大而活跃的社区,这意味着开发人员可以轻松找到帮助、资源和第三方软件包来扩展其 CLI 应用程序的功能。此外,Python 具有高度可扩展性,这意味着开发人员可以用 C 或 C++ 编写 Python 模块来优化其 CLI 应用程序的性能关键部分。

总体而言,Python 的易用性、可读性、跨平台兼容性和广泛的库使其成为构建命令行界面的绝佳选择。

现在让我们再谈谈命令行界面。

在 Python 中使用 CLI 通常涉及定义一个主函数,该函数在从命令行运行程序时调用。argparse 模块提供了一种定义用户可以输入的命令行参数和选项的方法,并将它们解析为一组可以在主函数中使用的 Python 对象。

click 库为在 Python 中构建 CLI 提供了一个更高级别的接口,具有更直观的语法和对命令组、上下文对象和进度条等功能的支持。 docopt 是另一个用于构建 CLI 的流行库,它使用的语法类似于在 README 文件中编写使用示例。

除了构建 CLI,Python 还可以使用 subprocess 模块在命令行上自动执行任务,该模块允许开发人员在 Python 程序中运行外部命令并与其输出进行交互。这对于文件操作、系统管理和测试等任务非常有用。

现在我们已经详细探讨了可用于创建 CLI 的不同包,让我们逐一在代码中使用它们。

argparse

argparse 是一个用于解析命令行参数和生成帮助消息的 Python 模块。它提供了一种在 Python 程序中定义和处理命令行参数的简单方法。使用 argparse,开发人员可以指定程序所需的参数,argparse 负责解析用户提供的命令行参数。

argparse 提供了许多功能,例如位置参数、可选参数、默认值、类型检查、帮助消息和子命令。它还支持不同的参数样式,包括短选项(例如"-f")、长选项(例如"--file")和组合短选项(例如"-xyz")。

考虑下面显示的代码。

示例

# argparse 示例

import argparse

def main():
	parser = argparse.ArgumentParser(description='Add some integers.')
	parser.add_argument('integers', metavar='N', type=int, nargs='+', help='integer list')
	parser.add_argument('--sum', action='store_const', const=sum, default=max, help='sum the integers (default: find the max)')
	args = parser.parse_args()
	result = args.sum(args.integers)
	print(result)

if __name__ == '__main__':
	main()

解释

此代码可让您运行 Python 脚本,并在运行时提供一些额外信息。

首先,您需要指定要添加的信息。您可以添加整数并选择是求和还是求最大值。您可以通过使用 argparse 模块设置参数来执行此操作。

接下来,当您运行程序时,您可以传入参数的值。程序将读取这些值并使用它们执行您请求的计算。

最后,程序将计算结果打印到屏幕上。

if __name__ == '__main__': 部分只是确保程序在运行时运行 main() 函数,但如果您将代码导入另一个程序,则不会运行它。

要运行上述 Python 脚本,我们可以运行下面显示的命令。

命令

python3 main.py 1 2 3 4

当我们将多个数字作为参数传递给命令行界面时,我们将获得以下输出。

输出

4

现在让我们与数字一起传递另一个名为 --sum 的参数。

命令

python3 main.py 1 2 3 4 --sum

输出

10

Click

Click 是一个 Python 库,可让您轻松为 Python 程序创建命令行界面 (CLI)。它提供了一种简单直观的方式来定义命令行参数和选项,并可轻松构建带有嵌套命令、帮助文本等的复杂命令行界面。使用 Click,您可以为您的 Python 程序创建专业级 CLI,而无需编写大量代码。许多 Python 开发人员使用 Click 为他们的程序构建 CLI。

现在让我们首先使用 click 创建一个简单的 CLI,第一个要求是在我们的机器上安装 click。

为了安装 click,我们可以运行下面显示的命令。

命令

pip install click

如果您使用的是最新版本的 python,您也可以使用 pip3。

考虑下面显示的代码。

示例

# Click 示例

import click

@click.command()
def main():
	click.echo("This is a CLI built with Click ✨")

if __name__ == "__main__":
	main()

解释

此代码是如何使用 Click 库为 Python 程序创建简单命令行界面 (CLI) 的示例。

@click.command() 装饰器告诉 Click,主函数是 CLI 命令。运行程序时,Click 将解析命令行参数并调用相应的 CLI 命令。

click.echo() 函数将指定的文本打印到命令行。在本例中,它打印消息"这是使用 Click 构建的 CLI"。

if __name__ == "__main__": 块确保仅在直接运行程序时调用主函数,而不是在将其作为模块导入另一个 Python 程序时调用主函数。

运行程序时,将调用主函数,进而调用 click.echo() 函数将消息打印到命令行。

要运行上述代码,我们可以运行下面显示的命令。

命令

python3 main.py

输出

This is a CLI built with Click ✨

现在让我们使用 click 创建一个交互式 CLI。

考虑下面显示的代码。

示例

import click

@click.command()
@click.option('--name', prompt='Your name', help='The person to greet.')
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--verbose', is_flag=True, help='Print verbose output.')
def hello(name, count, verbose):
	"""Simple program that greets NAME for a total of COUNT times."""
	for i in range(count):
    	greeting = f'Hello, {name}!'
    	if verbose:
        	greeting += f' ({i+1}/{count})'
    	click.echo(greeting)

if __name__ == '__main__':
	hello()

解释

此代码使用 Click 库定义了一个名为 hello 的 CLI 命令。@click.command() 装饰器告诉 Click hello 是一个命令。

@click.option() 装饰器定义了三个可以传递给 hello 命令的选项。--name 指定要问候的人的姓名,--count 指定问候的次数,--verbose 是启用详细输出的标志。

要运行上述代码,我们可以运行下面显示的命令。

命令

python3 main.py --name TutorialsPoint --count 3 --verbose

输出

Hello, TutorialsPoint! (1/3)
Hello, TutorialsPoint! (2/3)
Hello, TutorialsPoint! (3/3)

现在让我们利用 docopt 制作一个更具创意的 CLI。

Docopt

Docopt 是一个 Python 库,用于通过解析传递给 Python 脚本的参数来创建命令行界面。与需要明确定义命令和参数的 argparse 或 click 不同,docopt 使用自然语言语法来指定命令行参数及其在程序中的用法。这使得定义和使用命令行界面变得容易,而无需编写大量样板代码。使用 docopt,您可以以人类可读的格式定义程序的使用文档,然后 docopt 将自动为您生成命令行解析器。

考虑下面显示的代码。

示例

# docopt 示例

#!/usr/bin/env python

from docopt import docopt

def main(args):
	if args['--version']:
    	print('My CLI Tool Version 1.0')
	elif args['hello']:
    	print(f'Hello, {args["<name>"]}!')
	elif args['goodbye']:
    	print(f'Goodbye, {args["<name>"]}!')
	else:
    	print(__doc__)

if __name__ == '__main__':
	args = docopt(__doc__, version='My CLI Tool Version 1.0')
	main(args)

解释

docopt 库用于根据脚本的文档字符串中指定的使用说明解析命令行参数。args 字典包含已解析的命令行参数。

main 函数是脚本的入口点。它检查传递给脚本的命令行参数并打印相应的消息。

如果指定了 --version 选项,脚本将打印版本号。如果指定了 hello 选项,它将打印一条问候消息,并将提供的名称作为参数。如果指定了 goodbye 选项,它将打印一条告别消息,并将提供的名称作为参数。如果未指定这些选项,它将打印使用信息。

要运行上述代码,我们可以运行下面显示的命令。

命令

python3 main.py hello TutorialsPoint

输出

hello,TutorialsPoint!

结论

总之,命令行界面 (CLI) 是现代软件开发的重要组成部分。Python 提供了几个库,包括 argparse、Click 和 Docopt,可以快速轻松地构建命令行界面。每个库都有自己的优点和缺点,选择使用哪一个取决于项目的具体要求。

Argparse 是一个内置模块,提供了一种简单而强大的方法来解析命令行参数。Click 是一个第三方库,它提供了干净直观的语法,特别适用于构建复杂的命令行界面。 Docopt 是一种自然语言解析器,它根据使用描述生成命令行解析器。

无论选择哪个库,设计命令行界面时都应考虑用户的需求。界面应清晰易用,并应为用户提供有用的反馈。通过正确的设计和适当的库,Python 开发人员可以创建功能强大且用户友好的命令行界面,使他们的软件更易于访问和使用。


相关文章