Python 命令行界面编程?
在本节中,我们将使用 Python 开发一个命令行界面。但在深入研究程序之前,让我们先了解一下命令行。
命令行自计算机程序诞生以来就一直存在,并且建立在命令之上。命令行程序是从 shell 或命令行运行的程序。
命令行界面提供了一种用户界面,用户通过在终端、shell 或控制台上键入命令来导航,而不是使用鼠标。
命令行界面 (CLI) 从一个可执行文件开始。我们可以根据脚本的开发方式传递参数,例如:
**参数 (Arguments):** 我们需要提供传递给脚本的参数。如果我们没有提供它,CLI 将会报错。例如,在这个命令中,numpy 是参数:pip install numpy。
**选项 (Options):** 一个可选参数,它带有名称和值对,例如:pip install django –cache-dir ./my-cache-dir,其中 –cache_dir 是一个可选参数,值 ./my-cache-dir 将用作缓存目录。
**标志 (Flags):** 另一个可选参数,它告诉脚本启用或禁用某种行为,例如 –help 参数。
Python 提供多个 Python 包来编写命令行界面,例如 “click”。Click 允许我们用很少的代码行构建命令行界面。
下面是一个不使用 click 包的命令行界面程序。编写 CLI 程序可能不如使用 “click” 包时那样优雅,因为 “click” 允许你遵循“不要重复自己”(DRY)原则。
不使用 click 包的命令行界面
import sys import random def 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('He’s not the Messiah—he’s a very naughty boy') elif a == '--veg': print(random.choice(['Tomato','Reddis','Carrot', 'Potato', 'Turnip'])) else: print('Unrecognised argument.') if __name__ == '__main__': do_work()
输出
c:\Python\Python361>python cli_interp1.py --monty He’s not the Messiah—he’s a very naughty boy c:\Python\Python361>python cli_interp1.py --help Basic command line program Options: --help -> show this basic help menu. --monty -> show a Monty Python quote. --veg -> show a random vegetable c:\Python\Python361>python cli_interp1.py --veg Tomato c:\Python\Python361>python cli_interp1.py --error Unrecognised argument.
正如你在上面的程序中看到的,它在更改参数名称方面灵活性不高。
下面是使用 Python click 包实现 CLI 的相同程序。
import click import random @click.command() @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('He’s not the Messiah—he’s a very naughty boy') if veg: print(random.choice(['Tomato','Reddis','Carrot', 'Potato', 'Turnip'])) if __name__ == '__main__': do_work()
输出
c:\Python\Python361>python cli_interp2.py --help Usage: cli_interp2.py [OPTIONS] Basic Click example will follow your commands Options: --monty TEXT Show a Monty Python quote. --veg TEXT Show a random vegetable. --help Show this message and exit.
上面的程序表明,使用 “click” 包编写 CLI 更加容易,并节省了大量程序员的工作。
广告