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 更加容易,並節省了大量程式設計師的工作。

更新於:2019年7月30日

680 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.