使用Click、Docopt和Fire库编写您自己的命令行应用程序。有时一个命令行工具就足以完成一项工作。命令行工具是一种程序,您可以与之交互或从诸如shell或终端之类的东西运行。Git和Curl是您可能已经熟悉的两个命令行工具。当您有一小段代码需要在一行中或频繁执行多次时,命令行工具很有用。Django开发者执行./manage.pyrunserver来启动他们的web服务器;Docker开发人员执行docker-composeup来启动他们的容器。您想要编写命令行工具的原因可能与您最初想要编写代码的原因大相径庭。对于本月的Python专栏,我们有3个库要介绍给希望自己编写命令行工具的Python用户。ClickClick是我们用于开发命令行工具的最新Python包。它:具有出色的示例丰富的文档,展示了如何将命令行工具打包到更易于执行的Python应用程序中。自动生成有用的帮助文本,允许您堆叠可选和必需的参数,即使使用多个命令也是如此。用于编写管理命令的Django版本(django-click)Click使用@click.command()将函数声明为命令,并可以指定必需和可选参数。#hello.pyimportclick@click.command()@click.option('--name',default='',help='你的名字')defsay_hello(name):click.echo("Hello{}!".format(name))if__name__=='__main__':say_hello()@click.option()装饰器声明一个可选参数,而@click.argument()装饰器声明一个必需参数。您可以通过堆叠装饰器来组合可选参数和必需参数。echo()方法将结果打印到控制台。$pythonhello.py--name='Lacey'HelloLacey!DocoptDocopt是命令行工具的解析器,类似于命令行工具的Markdown。如果你喜欢流畅地编写应用程序文档,Docopt拥有本文推荐的库中格式最好的帮助文本。它不是我们最好的命令行工具开发包的原因是它的文档把人扔进了深渊,让人上手有点困难。但是,它仍然是一个轻量级且流行的库,尤其是当一个好的文档对您很重要的时候。Docopt在文章开头专门讲了如何格式化docstring。在工具名称后的文档环中,顶部元素必须是Usage:并且需要列出您希望如何调用命令(例如调用自身、使用参数等)。用法:需要包含帮助和版本参数。文档字符串中的第二个元素是Options:,它应该提供有关Usages:中提到的选项和参数的更多信息。文档字符串的内容成为帮助文本的内容。"""HELLOCLIUsage:hello.pyhello.pyhello.py-h|--helphello.py-v|--versionOptions:可选名称参数。-h--help显示此屏幕。-v--version显示版本。"""fromdocoptimportdocoptdefsay_hello(name):return("Hello{}!".format(name))if__name__=='__main__':arguments=docopt(__doc__,version='DEMO1.0')ifarguments['']:print(say_hello(arguments['']))else:print(arguments)在最基本的层面上,Docopt旨在返回您的参数键-值对。如果我在没有指定上述名称的情况下调用上述命令,我将得到一个字典返回值:$pythonhello.py{'--help':False,'--version':False,'':None}这里可以看到我没有输入help和version标签,name参数为None。但是如果我用name参数调用它,say_hello函数就会被执行。$pythonhello.pyJeffHelloJeff!Docopt允许指定必需参数和可选参数,每个参数都有不同的语法约定。强制参数需要用ALLCAPS和显示,可选参数需要用单双划线显示,就像--like。有关详细信息,请阅读Docopt关于模式的文档。FireFire是Google的命令行工具开发库。特别好的是,当您的命令需要更复杂的参数或处理Python对象时,它会智能地尝试解析您的参数类型。Fire文档包含大量示例,但我希望它们组织得更好。Fire可以在同一个文件中处理多个命令,使用对象方法作为命令和分组命令。它的弱点在于输出到控制台的文档。命令行的docstring不会出现在帮助文本中,帮助文本也不一定能识别参数。importfiredefsay_hello(name=''):return'Hello{}!'.format(name)if__name__=='__main__':fire.Fire()参数是必需的还是可选的取决于你是否在定义它函数或方法为其指定了默认值。要调用命令,必须指定文件名和函数名,这类似于Click的语法:$pythonhello.pysay_helloRikkiHelloRikki!也可以传递标签之类的参数,比如--name=Rikki。奖励:打包!Click包含使用setuptools打包命令行工具的说明(强烈建议按照说明进行操作)。要从我们的第一个示例中打包命令行工具,请将以下内容添加到您的setup.py文件中:click',],entry_points='''[console_scripts]hello=hello:say_hello''',)哪里看到hello,就把它换成你自己的模块名,但是忽略它。py后缀。将say_hello替换为您的函数名称。然后,执行pipinstall--editable使您的命令在命令行上可用。现在您可以像这样调用您的命令:$hello--name='Jeff'你好杰夫!通过打包您的命令,您可以节省在控制台键入pythonhello.py--name='Jeff'的额外步骤以减少击键。这些说明也可能在我们提到的其他库中可用。