如何使用Click在Python中创建自己的命令行程序

Click是用于编写命令行界面的Python软件包。它为您提供了精美的文档,并允许您仅用一行代码即可构建命令行界面。简而言之:它很棒,可以帮助您将程序提升到一个新的水平。

这里是您可以使用它来丰富Python项目的方法。

无需单击即可编写命令行程序< /

可以在不使用Click的情况下编写命令行程序,但这需要更多的精力和更多的代码。您需要解析命令行参数,执行验证,开发逻辑以处理不同的参数以及构建自定义帮助菜单。是否要添加新选项?然后,您将修改帮助功能。

编写自己的代码没有错,这是学习Python的好方法,但是Click允许您遵循“不要重复自己" (DRY)原则。如果没有Click,您将编写易碎的代码,并且每当发生任何更改时都需要大量维护。

这是一个简单的命令行界面,没有Click:

import sysimport randomdef do_work():	""" Function to handle command line usage"""	args = sys.argv	args = args[1:] # First element of args is the file name	if len(args) == 0:		print('You have not passed any commands in!')	else:		for a in args:			if a == '--help':				print('Basic command line program')				print('Options:')				print('    --help -> show this basic help menu.')				print('    --monty -> show a Monty Python quote.')				print('    --veg -> show a random vegetable')			elif a == '--monty':				print('What\'s this, then? "Romanes eunt domus"? People called Romanes, they go, the house?')			elif a == '--veg':				print(random.choice(['Carrot', 'Potato', 'Turnip']))			else:				print('Unrecognised argument.')if __name__ == '__main__':	do_work()

Click的逻辑与此相同:

import clickimport [email protected]()@click.option('--monty', default=False, help='Show a Monty Python quote.')@click.option('--veg', default=False, help='Show a random vegetable.')def do_work(monty, veg):	""" Basic Click example will follow your commands"""	if monty:		print('What\'s this, then? "Romanes eunt domus"? People called Romanes, they go, the house?')	if veg:		print(random.choice(['Carrot', 'Potato', 'Turnip']))if __name__ == '__main__':	do_work()

此Click示例在16行代码中实现了相同的逻辑。将为您解析参数,并生成帮助屏幕:

此基本比较显示了通过使用诸如Click之类的程序可以节省多少时间和精力。虽然命令行界面对于最终用户可能看起来相同,但是底层代码更简单,并且您可以节省大量时间。您以后编写的任何更改或更新也将看到大量的开发时间。

Python的点击入门

Before using Click, you may wish to configure a virtual environment if you want to play around with Python and Click.

最后,请确保您正在运行Python版本3。可以在Python版本2中使用Click,但是这些示例在Python 3中。了解有关Python 2和Python 3之间差异的更多信息。

一旦准备好,请使用PIP从命令行安装Click(如何为Python安装PIP):

pip install click

编写您的首次点击程序

在文本编辑器中,首先导入Click:

import click

一旦导入,请创建一个方法和一个主要入口点。我们的Python OOP指南更详细地介绍了这些内容,但是它们提供了存储代码的地方以及Python开始运行它的方式:

import clickimport randomdef veg():    """ Basic method will return a random vegetable"""        print(random.choice(['Carrot', 'Potato', 'Turnip', 'Parsnip']))if __name__ == '__main__':    veg()

这个非常简单的脚本将输出随机的代码。您的代码可能看起来有所不同,但是此简单示例非常适合与Click结合使用。

将其另存为 click_example.py ,然后在命令行中运行(导航到其位置):

python click_example.py

您应该看到一个随机的蔬菜名称。让我们通过添加Click来改善情况。更改代码,使其包含Click装饰器和 for 循环:

@click.command()@click.option('--total', default=3, help='Number of vegetables to output.')def veg(total):    """ Basic method will return a random vegetable"""    for number in range(total):    print(random.choice(['Carrot', 'Potato', 'Turnip', 'Parsnip']))if __name__ == '__main__':    veg()

运行时,您会看到随机显示了3次蔬菜。

Let’s break down these changes. The @click.command() decorator configures Click to work with the function immediately following the decorator. In this case, this is the veg() function. You’ll need this for every method you’d like to use with Click.

The @click.option decorator configures click to accept parameters from the command line, which it will pass to your method. There are three arguments used here:

  • -总计:这是 total 参数的命令行名称。
  • 默认值:如果未指定使用脚本时的总参数,单击将使用默认值。
  • 帮助:简短的句子解释如何使用程序。
  • 让我们请参阅实际点击。在命令行中,运行脚本,但要像这样传递 total 参数:

    python click_example.py --total 10

    通过在命令行中设置-总计10 ,您的脚本将随机打印十种蔬菜。

    如果您通过 –help 标志,您会看到一个不错的帮助页面,以及可以使用的选项:

    python click_example.py --help

    添加更多命令

    在同一功能上可以使用许多Click装饰器。向 veg 函数添加另一个单击选项:

    @click.option('--gravy', default=False, help='Append "with gravy" to the vegetables.')

    别忘了将此选项传递给方法:

    def veg(total, gravy):

    现在,当您运行文件时,您可以输入 gravy 标志:

    python click_example.py --gravy y

    帮助屏幕也已更改:

    以下是整个代码(对代码进行了一些小的重构) :

    import clickimport [email protected]()@click.option('--gravy', default=False, help='Append "with gravy" to the vegetables.')@click.option('--total', default=3, help='Number of vegetables to output.')def veg(total, gravy):    """ Basic method will return a random vegetable"""    for number in range(total):        choice = random.choice(['Carrot', 'Potato', 'Turnip', 'Parsnip'])        if gravy:            print(f'{choice} with gravy')        else:            print(choice)if __name__ == '__main__':    veg()

    更多点击选项

    一旦您了解基本知识,就可以开始研究更复杂的点击选项。在此示例中,您将学习如何将多个值传递给单个参数,Click会将其转换为元组。您可以在我们的Python词典指南中了解有关元组的更多信息。

    创建一个名为 click_example_2.py 的新文件。这是您需要的入门代码:

    import clickimport [email protected]()def add():    """ Basic method will add two numbers together."""    passif __name__ == '__main__':    add()

    这里没有新内容。上一节将详细解释此代码。添加名为数字 @ click.option

    @click.option('--numbers', nargs=2, type=int, help='Add two numbers together.')

    此处唯一的新代码是 nargs = 2 ,并且 type = int 选项。这表明Click接受数字选项的两个值,并且它们都必须均为整数类型。您可以将其更改为任何所需的数字或(有效)数据类型。

    最后,更改 add 方法以接受 numbers 参数,然后执行对它们进行一些处理:

    def add(numbers):     """ Basic method will add two numbers together."""     result = numbers[0] + numbers[1]     print(f'{numbers[0]} + {numbers[1]} = {result}')

    您传递的每个值都可以通过 numbers 对象进行访问。在命令行中使用它的方法如下:

    python click_example_2.py --numbers 1 2

    单击是Python实用程序的解决方案

    如您所见,Click易于使用,但功能强大。虽然这些示例仅介绍了Click的基本知识,但您已经掌握了这些基本知识,因此您可以了解更多功能。

    如果您正在寻找一些Python项目来练习新发现的技能,为什么不学习如何使用Python控制Arduino?这些项目中的任何一个都非常适合转换为Click!

    标签: 编码教程 Python