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


在这篇文章中,我们将学习和探索如何在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 example

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 Example

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 example

#!/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库用于根据脚本docstring中指定的使用说明解析命令行参数。args字典包含已解析的命令行参数。

主函数是脚本的入口点。它检查传递给脚本的命令行参数,并打印相应的邮件。

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

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

命令

python3 main.py hello TutorialsPoint

输出

Hello, TutorialsPoint!

结论

总而言之,命令行界面(CLI)是现代软件开发中不可或缺的一部分。Python提供多个库,包括argparse、Click和Docopt,可以快速轻松地构建命令行界面。这些库各有优缺点,选择哪个库取决于项目的具体要求。

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

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

更新于:2023年8月3日

613 次浏览

启动你的职业生涯

完成课程获得认证

开始
广告