如何在Python中建立漂亮的命令列介面?


在這篇文章中,我們將學習和探索如何在Python中建立漂亮的命令列介面。

首先,讓我們簡單談談Python,然後我們將討論命令列介面。

為什麼選擇Python?

Python是一種流行的高階程式語言,以其簡潔性、可讀性和多功能性而聞名。Python由Guido van Rossum在20世紀80年代後期建立,此後已成為最廣泛使用的用於Web開發、科學計算、資料分析和機器學習的語言之一。

Python的語法設計直觀易懂,重點在於減少表達給定任務所需的程式碼量。這使得它成為初學者以及希望快速原型設計或開發複雜應用程式的經驗豐富程式設計師的熱門選擇。

Python是構建命令列介面(CLI)的熱門選擇,因為它是一種高階語言,具有簡潔易讀的語法,可以輕鬆編寫和維護程式碼。Python的廣泛標準庫包含支援構建CLI的模組,例如argparse、click和docopt,它們提供易於使用且靈活的命令列引數解析和幫助訊息生成。

此外,Python是平臺無關的,這意味著在一個平臺上編寫的程式碼可以在另一個平臺上輕鬆執行,無需任何修改。這使得開發人員更容易編寫可在多個作業系統(包括Windows、Linux和macOS)上使用的跨平臺命令列應用程式。

Python還擁有一個龐大而活躍的社群,這意味著開發人員可以輕鬆找到幫助、資源和第三方包來擴充套件其CLI應用程式的功能。此外,Python具有很高的可擴充套件性,這意味著開發人員可以用C或C++編寫Python模組來最佳化其CLI應用程式中效能關鍵的部分。

總的來說,Python的易用性、可讀性、跨平臺相容性和廣泛的庫使其成為構建命令列介面的絕佳選擇。

現在讓我們更詳細地討論一下命令列介面。

在Python中使用CLI通常涉及定義一個主函式,該函式在從命令列執行程式時被呼叫。argparse模組提供了一種定義使用者可以輸入的命令列引數和選項以及將其解析為可在主函式中使用的Python物件集的方法。

click庫為在Python中構建CLI提供了更高級別的介面,具有更直觀的語法並支援命令組、上下文物件和進度條等功能。docopt是另一個流行的用於構建CLI的庫,它使用類似於在README檔案中編寫使用示例的語法。

除了構建CLI之外,Python還可以使用subprocess模組來自動執行命令列上的任務,該模組允許開發人員執行外部命令並在Python程式中與其輸出進行互動。這對於檔案操作、系統管理和測試等任務非常有用。

既然我們已經詳細探討了可用於建立CLI的不同包,讓我們逐一在程式碼中使用它們。

argparse

argparse是一個用於解析命令列引數和生成幫助訊息的Python模組。它提供了一種在Python程式中輕鬆定義和處理命令列引數的方法。使用argparse,開發人員可以指定程式期望的引數,argparse負責解析使用者提供的命令列引數。

argparse提供了許多功能,例如位置引數、可選引數、預設值、型別檢查、幫助訊息和子命令。它還支援不同的引數樣式,包括短選項(例如“-f”)、長選項(例如“--file”)和組合短選項(例如“-xyz”)。

考慮以下程式碼。

示例

# argparse example

import argparse

def main():
	parser = argparse.ArgumentParser(description='Add some integers.')
	parser.add_argument('integers', metavar='N', type=int, nargs='+', help='integer list')
	parser.add_argument('--sum', action='store_const', const=sum, default=max, help='sum the integers (default: find the max)')
	args = parser.parse_args()
	result = args.sum(args.integers)
	print(result)

if __name__ == '__main__':
	main()

解釋

此程式碼允許您執行一個Python指令碼,幷包含您執行時提供的一些額外資訊。

首先,您需要指定要新增的資訊。您可以新增整數,並選擇是將它們相加還是找到最大值。您可以使用**argparse**模組設定引數來實現。

接下來,執行程式時,您可以傳遞引數的值。程式將讀取這些值並使用它們執行您請求的計算。

最後,程式將計算結果列印到螢幕上。

if __name__ == '__main__': 部分只是確保程式在您執行它時執行 main() 函式,但如果您將程式碼匯入另一個程式,則不會執行它。

要執行上述Python指令碼,我們可以執行以下命令。

命令

python3 main.py 1 2 3 4  

當我們將多個數字作為引數傳遞給我們的命令列介面時,我們將得到以下輸出。

輸出

4

現在讓我們傳遞另一個引數,名為 --sum 以及數字。

命令

python3 main.py 1 2 3 4  --sum

輸出

10

Click

Click是一個Python庫,可以輕鬆地為您的Python程式建立命令列介面(CLI)。它提供了一種簡單直觀的方法來定義命令列引數和選項,並可以輕鬆構建具有巢狀命令、幫助文字等的複雜命令列介面。使用Click,您可以為您的Python程式建立一個專業級的CLI,而無需編寫大量程式碼。許多Python開發人員使用Click為他們的程式構建CLI。

現在讓我們首先使用click建立一個簡單的CLI,第一個要求是在我們的機器上安裝click。

為了安裝click,我們可以執行以下命令。

命令

pip install click

如果您使用的是最新版本的python,也可以使用pip3。

考慮以下程式碼。

示例

# Click Example

import click

@click.command()
def main():
	click.echo("This is a CLI built with Click ✨")

if __name__ == "__main__":
	main()

解釋

此程式碼是一個示例,演示瞭如何使用Click庫為Python程式建立簡單的命令列介面(CLI)。

@click.command() 裝飾器告訴Click主函式是一個CLI命令。執行程式時,Click將解析命令列引數並呼叫相應的CLI命令。

click.echo() 函式將指定的文字列印到命令列。在這種情況下,它列印訊息“這是一個使用Click構建的CLI”。

if __name__ == "__main__": 塊確保主函式僅在直接執行程式時呼叫,而不是在將其作為模組匯入到另一個Python程式時呼叫。

執行程式時,將呼叫主函式,進而呼叫click.echo() 函式將訊息列印到命令列。

要執行上述程式碼,我們可以執行以下命令。

命令

python3 main.py

輸出

This is a CLI built with Click ✨

現在讓我們使用click建立一個互動式CLI。

考慮以下程式碼。

示例

import click

@click.command()
@click.option('--name', prompt='Your name', help='The person to greet.')
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--verbose', is_flag=True, help='Print verbose output.')
def hello(name, count, verbose):
	"""Simple program that greets NAME for a total of COUNT times."""
	for i in range(count):
    	greeting = f'Hello, {name}!'
    	if verbose:
        	greeting += f' ({i+1}/{count})'
    	click.echo(greeting)

if __name__ == '__main__':
	hello()

解釋

此程式碼使用Click庫定義了一個名為hello的CLI命令。@click.command() 裝飾器告訴Click hello是一個命令。

@click.option() 裝飾器定義了三個可以傳遞給hello命令的選項。--name指定要問候的人的姓名,--count指定問候他們的次數,--verbose是一個啟用詳細輸出的標誌。

要執行上述程式碼,我們可以執行以下命令。

命令

python3 main.py --name TutorialsPoint --count 3 --verbose

輸出

Hello, TutorialsPoint! (1/3)
Hello, TutorialsPoint! (2/3)
Hello, TutorialsPoint! (3/3)

現在讓我們透過使用docopt建立另一個更具創意的CLI。

Docopt

Docopt是一個Python庫,用於透過解析傳遞給Python指令碼的引數來建立命令列介面。與需要顯式定義命令和引數的argparse或click不同,docopt使用自然語言語法來指定命令列引數及其在程式中的用法。這使得在無需編寫大量樣板程式碼的情況下輕鬆定義和使用命令列介面。使用docopt,您可以以人類可讀的格式定義程式的使用文件,然後docopt將自動為您生成命令列解析器。

考慮以下程式碼。

示例

# docopt example

#!/usr/bin/env python

from docopt import docopt

def main(args):
	if args['--version']:
    	print('My CLI Tool Version 1.0')
	elif args['hello']:
    	print(f'Hello, {args["<name>"]}!')
	elif args['goodbye']:
    	print(f'Goodbye, {args["<name>"]}!')
	else:
    	print(__doc__)

if __name__ == '__main__':
	args = docopt(__doc__, version='My CLI Tool Version 1.0')
	main(args)

解釋

docopt庫用於根據指令碼docstring中指定的使用說明解析命令列引數。args字典包含已解析的命令列引數。

主函式是指令碼的入口點。它檢查傳遞給指令碼的命令列引數,並列印相應的郵件。

如果指定了 --version 選項,則指令碼將列印版本號。如果指定了hello選項,則它將列印帶有作為引數提供的名稱的問候訊息。如果指定了goodbye選項,則它將列印帶有作為引數提供的名稱的告別訊息。如果沒有指定這些選項,則它將列印使用資訊。

要執行上述程式碼,我們可以執行以下命令。

命令

python3 main.py hello TutorialsPoint

輸出

Hello, TutorialsPoint!

結論

總而言之,命令列介面(CLI)是現代軟體開發中不可或缺的一部分。Python提供多個庫,包括argparse、Click和Docopt,可以快速輕鬆地構建命令列介面。這些庫各有優缺點,選擇哪個庫取決於專案的具體要求。

Argparse是一個內建模組,它提供了一種簡單而強大的方法來解析命令列引數。Click是一個第三方庫,它提供了一個簡潔直觀的語法,尤其適用於構建複雜的命令列介面。Docopt是一個自然語言解析器,它根據使用說明生成命令列解析器。

無論選擇哪個庫,都必須以使用者為中心設計命令列介面。介面應該清晰易用,並向用戶提供有用的反饋。透過正確的設計和合適的庫,Python開發人員可以建立強大且使用者友好的命令列介面,使他們的軟體更易於訪問和使用。

更新於:2023年8月3日

613 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始
廣告