python開發(fā)簡單的命令行工具簡介
介紹
Python模塊argparse,這是一個命令行選項(xiàng),參數(shù)和子命令的解釋器,使用該模塊可以編寫友好的命令行工具,在程序中定義好需要的參數(shù),argparse將弄清楚如何解析 sys.argv中的參數(shù)。argparse模塊還支持自動生成幫助和用法信息,當(dāng)模塊解析到無效參數(shù)時,還可以發(fā)出錯誤。
python標(biāo)準(zhǔn)庫sys模塊
sys.agv #命令行參數(shù)List,第一個元素時程序本身路徑 sys.exit(n) #退出程序,正常退出時exit(0) sys.version #獲取Python解釋程序的版本信息 sys.maxint #最大的Int值 sys.path #返回模塊的搜索路徑,初始化時使用PYTHONPATH環(huán)境變量的值 sys.stdin #輸入線管 sys.stdout #輸出相關(guān) sys.stderror #錯誤相關(guān)
命令行工具
我們使用過很多的命令行工具,那么python開發(fā)出的命令行工具,能列舉出哪些呢?
其實(shí)python本身就是一個命令行工具,在cmd中使用python --help,能輸出python的幫助語句,這就是命令行工具解析參數(shù)后輸出的一個例子。
再有,pip 也是一個典型的例子,在使用pip時,不同的子命令可以達(dá)成不同的效果。
當(dāng)然知道和做到相距實(shí)在太過遙遠(yuǎn),我也很難寫出一個python或pip。
概念
argparse是一個較大的模塊,提供了很多功能,它的文檔相當(dāng)詳細(xì)和完整,包含大量示例。所以學(xué)習(xí)該模塊最好的教程就是官方文檔,argparse( https://docs.python.org/zh-cn/3/library/argparse.html),那么為什么我沒去看呢,一方面是我并不需要復(fù)雜的功能,另一方面我的英語閱讀能力不足以讓我完全理解該文檔。我們必須承認(rèn),英語水平分開了普通的技術(shù)人員,因此我正在努力提升英語水平。
在開發(fā)一個命令行工具前,我們首先需要知道一個命令行工具包含了哪些內(nèi)容,它又是怎么識別我們提供的參數(shù)的,識別后又是怎么提供輸出的,對待錯誤的選項(xiàng),它又是如何調(diào)整的。
因此,官網(wǎng)使用了 ‘ls’ 這個命令來介紹命令行工具的幾個概念:
- ls 是一個即使在運(yùn)行的時候沒有提供任何選項(xiàng),也非常有用的命令。在默認(rèn)情況下他會輸出當(dāng)前文件夾包括的內(nèi)容。
- 如果我們想要使用比它默認(rèn)提供的更多功能,我們需要告訴該命令更多信息。我們可以指定所謂的位置參數(shù),之所以這樣命名,是因?yàn)槌绦驊?yīng)該如何處理該參數(shù)值,完全取決于它在命令行出現(xiàn)的文職。更能體現(xiàn)這個概念的命令如 cp ,它最基本的用法是
cp SRC DEST,第一個位置參數(shù)指的是你想要復(fù)制的,第二個位置參數(shù)指的是你想要復(fù)制到的位置。 - 現(xiàn)在假設(shè)我們想要改變這個程序的行為。使用 **ls -l ,**我們可以輸出更多的信息,在這個例子中,-l 被稱為可選參數(shù)。
- **–help **通常被用來輸出幫助文檔,它是非常有用的,因?yàn)楫?dāng)你遇到一個你從未使用過的程序時,你可以通過閱讀它的幫助文檔來弄清楚它是如何運(yùn)行的。
了解了這些,我們通過幾個例子可以更好的說明這個模塊是如何解析從命令行獲取的參數(shù)的,并且解析出的參數(shù)又是如何被程序使用的。
基礎(chǔ)
命令行參數(shù)解析很容易,但是它也可以被加入很多參數(shù),注入很多定義,這讓最后的程序變得不堪入目,為了防止我的朋友,也就是你,在開始就頭痛,我首先帶來一個我認(rèn)為最簡單的案例。
示例
所有解析都應(yīng)當(dāng)配有示例,并展示對比來說明程序的行為有哪些改變。
argparse使用主要有四個步驟:
- 導(dǎo)入argparse包
- 創(chuàng)建 ArgumentParser() 參數(shù)對象
- 調(diào)用 add_argument() 方法往參數(shù)對象中添加參數(shù)
- 使用 parse_args() 解析添加參數(shù)的參數(shù)對象,獲得解析對象
- 程序其他部分,當(dāng)需要使用命令行參數(shù)時,使用解析對象.參數(shù)獲取
在未使用argparse模塊前,我編寫了這樣一個python文件。
print("hello world!")
我們很熟悉這個案例,毫無疑問我們清楚python運(yùn)行該文件時會得到什么樣的輸出,當(dāng)我們在終端運(yùn)行這個python文件demo1時,我們會使用以下命令。
$ python demo1.py hello world!
是的,我們看到在命令行中,運(yùn)行該文件輸出了我們想要的結(jié)果,一般情況下,我們需要python文件輸出某個值時,要么我們將該值在文件中寫死,就像上面這個例子一樣,我們已經(jīng)在文件中將想要的輸出寫死在文件中,這個值在未被輸出時就已經(jīng)在程序中被決定。如果我們需要用戶在終端中向程序提供某些值,來改變程序的行為,得到不同的輸出,我們常用的手段是使用input,讓程序讀入終端的輸入來達(dá)到這樣的效果。不過這樣做仍然需要手動的輸入,如果是自動化程序,那么可以使用參數(shù)直接帶入需要的變量將大大減少這樣的交互。
接下來我將演示如何使用argparse來完成一個簡單的參數(shù)解析。
import argparse #導(dǎo)入argparse包
parse = argparse.ArgumentParser() #創(chuàng)建參數(shù)對象
parse.add_argument('hello') #向參數(shù)對象中添加參數(shù)
args = parse.parse_args() #解析參數(shù)對象獲得解析對象
if __name__ == '__main__':
print(args.hello)
讓我們來運(yùn)行一下這個程序
$ python demo1.py helloworld helloworld
很簡單,這是一個容易的例子,需要注意的是,由于沒有指定,所以命令行參數(shù)輸入默認(rèn)按順序復(fù)制,順序不同的話得到的結(jié)果將不同。
接下來我將帶入一些官網(wǎng)上的案例,來繼續(xù)解釋argparse的一些進(jìn)階示例。
使用介紹
- –help 選項(xiàng),也可縮寫為 -h,是唯一一個可以直接使用的選項(xiàng)(即不需要指定該選項(xiàng)的內(nèi)容)。指定任何內(nèi)容都會導(dǎo)致錯誤。即便如此,我們也能直接得到一條有用的用法信息。
add_argument()方法,定義如何解析命令行參數(shù),對于該方法,參數(shù)解釋如下:
- name or flags - 選項(xiàng)字符串的名字或者列表,例如 foo 或者 -f, --foo。
- action - 命令行遇到參數(shù)時的動作,默認(rèn)值是 store。
- store_const,表示賦值為const;
- – append,將遇到的值存儲成列表,也就是如果參數(shù)重復(fù)則會保存多個值;
- – append_const,將參數(shù)規(guī)范中定義的一個值保存到一個列表;
- – count,存儲遇到的次數(shù);此外,也可以繼承 argparse.Action 自定義參數(shù)解析;
- nargs - 應(yīng)該讀取的命令行參數(shù)個數(shù),可以是
- 具體的數(shù)字,或者是?號,當(dāng)不指定值時對于 Positional argument 使用 default,對于 Optional argument 使用 const
- 或者是 * 號,表示 0 或多個參數(shù);
- 或者是 + 號表示 1 或多個參數(shù)。
- const - action 和 nargs 所需要的常量值。
- default - 不指定參數(shù)時的默認(rèn)值。
- type - 命令行參數(shù)應(yīng)該被轉(zhuǎn)換成的類型。
- choices - 參數(shù)可允許的值的一個容器。
- required - 可選參數(shù)是否可以省略 (僅針對可選參數(shù))。
- help - 參數(shù)的幫助信息,當(dāng)指定為 argparse.SUPPRESS 時表示不顯示該參數(shù)的幫助信息.
- metavar - 在 usage 說明中的參數(shù)名稱,對于必選參數(shù)默認(rèn)就是參數(shù)名稱,對于可選參數(shù)默認(rèn)是全大寫的參數(shù)名稱.
- dest - 解析后的參數(shù)名稱,默認(rèn)情況下,對于可選參數(shù)選取最長的名稱,中劃線轉(zhuǎn)換為下劃線.
可選參數(shù)設(shè)置
通過在參數(shù)名前加 --, 設(shè)置為可選參數(shù),如果未輸入,則使用default默認(rèn)值,若為設(shè)置default則默認(rèn)賦值 None
parse.add_argument('-n', '--name', type=str, metavar='name', help='New flavor name')
引用名,可以縮短參數(shù)名,簡化命令行參數(shù)輸入;也就是使用-n或者-name可以獲得一樣的效果
必選參數(shù)設(shè)置
需要一個必選參數(shù)時,則設(shè)置required=True,這時,無論參數(shù)是否時可選參數(shù),都必須輸入
列表參數(shù)傳入設(shè)置
添加narg='+' 這樣可以在命令行中添加若干個參數(shù),傳入后將被添加到列表中。
互斥參數(shù)
也就是add_mutually_exclusive_group方法,這讓我們可以添加兩個互相排斥的參數(shù),也就是只能選擇其中一個參數(shù)添加
默認(rèn)參數(shù)設(shè)置
set_defaults()可以設(shè)置一些參數(shù)的默認(rèn)值
到此這篇關(guān)于python開發(fā)簡單的命令行工具簡介的文章就介紹到這了,更多相關(guān)python開發(fā)簡單的命令行工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
初次部署django+gunicorn+nginx的方法步驟
這篇文章主要介紹了初次部署django+gunicorn+nginx的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
淺談哪個Python庫才最適合做數(shù)據(jù)可視化
數(shù)據(jù)可視化是任何探索性數(shù)據(jù)分析或報(bào)告的關(guān)鍵步驟,目前有許多非常好的商業(yè)智能工具,比如Tableau、googledatastudio和PowerBI等,本文就詳細(xì)的進(jìn)行對比,感興趣的可以了解一下2021-06-06
使用Python的Flask框架來搭建第一個Web應(yīng)用程序
Flask框架是一個以輕量級著稱的Web開發(fā)框架,近兩年來在Web領(lǐng)域獲得了極高的人氣,這里我們就來看如何使用Python的Flask框架來搭建第一個Web應(yīng)用程序2016-06-06
10行Python代碼實(shí)現(xiàn)Web自動化管控的示例代碼
這篇文章主要介紹了10行Python代碼實(shí)現(xiàn)Web自動化管控的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
python 密碼學(xué)示例——凱撒密碼的實(shí)現(xiàn)
這篇文章主要介紹了python 密碼學(xué)示例——凱撒密碼的實(shí)現(xiàn),幫助大家更好的利用python處理密碼,感興趣的朋友可以了解下2020-09-09
python interpret庫訓(xùn)練模型助力機(jī)器學(xué)習(xí)
這篇文章主要為大家介紹了python interpret庫訓(xùn)練模型功能特性,為你的機(jī)器學(xué)習(xí)提供便捷的路徑,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01

