python 编写命令行工具

你一定用过很多 linux 的命令行工具,并且觉得这些工具很酷。

Python 能编写这些工具吗?

答案是肯定的。今天我们就来看看如何用 python 编写命令行工具。

实现方式

如何接受cmd中输入的参数,需要用到的就是命令行解析工具。

python中有很多命令行解析库,主要有如下几种

  1. sys.argv

  2. argparse 库

  3. click 库

  4. fire 库(这是一个神器)

sys.argv

概念

可以把sys.argv理解成一个list

其中第一个元素是代码所在的module,比如代码是在cmd.py文件夹下编辑,

在命令行中运行python cmd.py

此时sys.argv[0]就是cmd.py

后面的元素是我们在命令行中给它加入的参数

例子

我们看一下下面例子

在cmd.py文件中输入下面内容

import sys
a = sys.argv
print(a)

在 cmd.py 所在文件夹中打开cmd(本文之后所有在cmd中输入都指的是在这个文件夹下的cmd),输入

测试日志。

PS D:\python\30-clis\arg> python .\cmd.py
['.\\cmd.py']
PS D:\python\30-clis\arg> python .\cmd.py  a b cv d
['.\\cmd.py', 'a', 'b', 'cv', 'd']

然后我们可以根据各个参数进行单独的处理。

但是这样直接处理的方式存在下面的问题:

  1. 一个个解析参数太麻烦了,无法对象化,使用很麻烦

  2. 参数的校验等等问题,需要每个开发者去单独处理

  3. 命令的文档等等怎么处理。一个个去路由写吗?很不优雅

这些问题,肯定会有人已经帮我们处理好了。

下面我们来看看这些方法:

命令行的常见概念

这里以 powershell 为例子。

基本命令

比如最常用的 ls 命令

ls

就可以罗列当前路径下的文件列表

帮助文档

当然,我们还需要知道其他的功能。

比如

help ls
  • 日志如下

PS C:\Users\binbin.hou> help ls

名称
    Get-ChildItem

语法
    Get-ChildItem [[-Path] <string[]>] [[-Filter] <string>]  [<CommonParameters>]

    Get-ChildItem [[-Filter] <string>]  [<CommonParameters>]


别名
    gci
    ls
    dir


备注
    Get-Help 在此计算机上找不到该 cmdlet 的帮助文件。它仅显示部分帮助。
        -- 若要下载并安装包含此 cmdlet 的模块的帮助文件,请使用 Update-Help。
        -- 若要联机查看此 cmdlet 的帮助主题,请键入: "Get-Help Get-ChildItem -Online" 或
           转到 https://go.microsoft.com/fwlink/?LinkID=113308。

特殊化使用

有时候我们希望递归查看文件,或者查看文件的详细信息。

就可以通过参数来指定。

大部分的工具都是这种套路。

CLI

必须在 setup.py 中指定

    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: Apache Software License",
        "Operating System :: OS Independent",
    ],

    # CLI 必须指定信息
    entry_points = {
        'console_scripts': [
            'emoji_cli = emoji_cli:main'
        ]
    }

参考资料

python命令行解析工具

https://www.jianshu.com/p/d3d6e5dfdbe9

参考资料

一文读懂:从 Python 打包到 CLI 工具