python 命令行工具

有时,适合该工作的正确工具是命令行应用程序。 命令行应用程序是一个程序,您可以与之交互或从诸如Shell或Terminal之类的程序中运行。 GitCurl是您可能已经熟悉的命令行应用程序示例。

当您有一些代码想要连续或定期运行几次时,命令行应用程序将非常有用。 Django开发人员运行./manage.py runserver类的命令来启动他们的Web服务器。 Docker开发人员运行docker-compose up来启动其容器。 您可能要编写命令行应用程序的原因与您首先要编写代码的原因一样多。

在本月的Python专栏中,我们提供了三个库,向希望编写自己的命令行工具的Pythonista推荐。

请点击

Click是我们最喜欢的用于命令行应用程序的Python软件包。 它:

  • 有大量的示例文件
  • 包含有关将您的应用程序打包为Python应用程序的说明,以便于运行
  • 自动生成有用的帮助文本
  • 使您可以堆叠可选和必需的参数,甚至几个命令
  • 具有用于编写管理命令的Django版本( django-click

Click使用其@click.command()将函数声明为命令并指定必需或可选参数。

# hello.py 
     
     
import click 
     
     

@ click. 
     
     command 
     
     ( 
     
     ) 
     
     
@ click. 
     
     option 
     
     ( 
     
     '--name' 
     
     , default 
     
     = 
     
     '' 
     
     , 
     
     help 
     
     = 
     
     'Your name' 
     
     ) 
     
     
def say_hello 
     
     ( name 
     
     ) :
     
     

    click. 
     
     echo 
     
     ( 
     
     "Hello {}!" . 
     
     format 
     
     ( name 
     
     ) 
     
     ) 
     
     

if __name__ 
     
     == 
     
     '__main__' :
     
     

    say_hello 
     
     ( 
     
     )

@click.option()装饰器声明一个可选参数 ,而@click.argument()装饰器声明一个必需参数 。 您可以通过堆叠装饰器来组合可选参数和必需参数。 echo()方法将结果打印到控制台。

$ python hello.py 
     
     --name = 
     
     'Lacey' 
     
     

Hello Lacey 
     
     !

Docopt

Docopt是一个命令行应用程序解析器,类似于您的命令行应用程序的Markdown。 如果您喜欢随时随地编写应用程序的文档,则Docopt拥有本文中有关选项的最佳格式的帮助文本。 它不是我们最喜欢的命令行应用程序库,因为它的文档将您立即带入深层次,这使入门变得有些困难。 尽管如此,它还是一个非常流行的轻量级库,尤其是在非常好的文档对您很重要的情况下。


helpversion标志。


文档字符串中的第二个元素应为“选项”,它应提供有关在“用法”中标识的选项和参数的更多信息。 文档字符串的内容将成为帮助文本的内容。

"""HELLO CLI


Usage:

    hello.py

    hello.py <name>

    hello.py -h|--help

    hello.py -v|--version


Options:

    <name>  Optional name argument.

    -h --help  Show this screen.

    -v --version  Show version.

""" 
     
     

from docopt 
     
     import docopt
     
     

def say_hello 
     
     ( name 
     
     ) :
     
     

    
     
     return 
     
     ( 
     
     "Hello {}!" . 
     
     format 
     
     ( name 
     
     ) 
     
     ) 
     
     


if __name__ 
     
     == 
     
     '__main__' :
     
     

    arguments 
     
     = docopt 
     
     ( __doc__ 
     
     , version 
     
     = 
     
     'DEMO 1.0' 
     
     ) 
     
     

    
     
     if arguments 
     
     [ 
     
     '<name>' 
     
     ] :
     
     

        
     
     print 
     
     ( say_hello 
     
     ( arguments 
     
     [ 
     
     '<name>' 
     
     ] 
     
     ) 
     
     ) 
     
     

    
     
     else :
     
     

        
     
     print 
     
     ( arguments 
     
     )

在最基本的层次上,Docopt旨在将您的参数作为键值对返回到控制台。 如果我在不指定名称的情况下调用上述命令,则会返回字典:

$ python hello.py 
     
     
{ 
     
     '--help' : False,
     
     

 
     
     '--version' : False,
     
     

 
     
     '<name>' : None 
     
     }

这表明我没有输入helpversion标志,并且name参数为None

但是,如果我使用名称来调用它, say_hello函数将执行。

$ python hello.py Jeff
     
     

Hello Jeff 
     
     !

Docopt允许使用必需参数和可选参数,并且每个参数都有不同的语法约定。 必需的参数应以ALLCAPS<carets> ,选项应以双破折号或单破折号表示,例如--name 。 在文档中阅读有关Docopt 模式的更多信息。

Fire是用于编写命令行应用程序的Google库。 当您的命令需要更复杂的参数或处理Python对象时,我们会特别喜欢它,因为它会尝试智能地解析您的参数类型。

Fire的文档包含大量示例,但我希望文档能更好地组织。 Fire可以在一个文件中处理多个命令 ,将命令作为对象上的方法以及命令进行分组

它的弱点是可用于控制台的文档。 命令上的文档字符串不会出现在帮助文本中,并且帮助文本不一定标识参数。

import fire
     
     


def say_hello 
     
     ( name 
     
     = 
     
     '' 
     
     ) :
     
     

    
     
     return 
     
     'Hello {}!' . 
     
     format 
     
     ( name 
     
     ) 
     
     


if __name__ 
     
     == 
     
     '__main__' :
     
     

  fire. 
     
     Fire 
     
     ( 
     
     )

参数是必需的还是可选的,取决于您是否在函数或方法定义中为其指定了默认值。 要调用此命令,必须指定文件名和函数名称,更类似于Click的语法:

$ python hello.py say_hello Rikki
     
     

Hello Rikki 
     
     !

您还可以将参数作为标志传递,例如--name=Rikki

奖励:包装!

单击包含说明(强烈建议您遵循它们)以使用setuptools 打包命令。

要打包我们的第一个示例,请将以下内容添加到您的setup.py文件中:

from setuptools 
     
     import setup
     
     


setup 
     
     ( 
     
     

    name 
     
     = 
     
     'hello' 
     
     , 
     
     

    version 
     
     = 
     
     '0.1' 
     
     , 
     
     

    py_modules 
     
     = 
     
     [ 
     
     'hello' 
     
     ] 
     
     , 
     
     

    install_requires 
     
     = 
     
     [ 
     
     

        
     
     'Click' 
     
     , 
     
     

    
     
     ] 
     
     , 
     
     

    entry_points 
     
     = 
     
     '''

        [console_scripts]

        hello=hello:say_hello

    ''' 
     
     , 
     
     
)

在任何地方都可以看到hello ,请替换模块的名称,但忽略.py扩展名。 在看到say_hello ,替换为函数的名称。

然后,运行pip install --editable使您的命令可用于命令行。

您现在可以像这样调用命令:

$ hello 
     
     --name = 
     
     'Jeff' 
     
     

Hello Jeff 
     
     !

通过打包命令,您无需在控制台中执行额外的步骤,即必须键入python hello.py --name='Jeff'并为自己节省了几次击键。 这些说明也可能适用于我们提到的其他库。

翻译自: https://opensource.com/article/18/5/3-python-command-line-tools

python 命令行工具