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文件中输入下面内容

  [py]
1
2
3
import sys a = sys.argv print(a)

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

测试日志。

  [plaintext]
1
2
3
4
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 命令

  [plaintext]
1
ls

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

帮助文档

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

比如

  [plaintext]
1
help ls
  • 日志如下
  [plaintext]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 中指定

  [py]
1
2
3
4
5
6
7
8
9
10
11
12
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 工具