python開發(fā)簡單的命令行工具簡介
介紹
Python模塊argparse,這是一個(gè)命令行選項(xiàng),參數(shù)和子命令的解釋器,使用該模塊可以編寫友好的命令行工具,在程序中定義好需要的參數(shù),argparse將弄清楚如何解析 sys.argv中的參數(shù)。argparse模塊還支持自動(dòng)生成幫助和用法信息,當(dāng)模塊解析到無效參數(shù)時(shí),還可以發(fā)出錯(cuò)誤。
python標(biāo)準(zhǔn)庫sys模塊
sys.agv #命令行參數(shù)List,第一個(gè)元素時(shí)程序本身路徑 sys.exit(n) #退出程序,正常退出時(shí)exit(0) sys.version #獲取Python解釋程序的版本信息 sys.maxint #最大的Int值 sys.path #返回模塊的搜索路徑,初始化時(shí)使用PYTHONPATH環(huán)境變量的值 sys.stdin #輸入線管 sys.stdout #輸出相關(guān) sys.stderror #錯(cuò)誤相關(guān)
命令行工具
我們使用過很多的命令行工具,那么python開發(fā)出的命令行工具,能列舉出哪些呢?
其實(shí)python本身就是一個(gè)命令行工具,在cmd中使用python --help,能輸出python的幫助語句,這就是命令行工具解析參數(shù)后輸出的一個(gè)例子。
再有,pip 也是一個(gè)典型的例子,在使用pip時(shí),不同的子命令可以達(dá)成不同的效果。
當(dāng)然知道和做到相距實(shí)在太過遙遠(yuǎn),我也很難寫出一個(gè)python或pip。
概念
argparse是一個(gè)較大的模塊,提供了很多功能,它的文檔相當(dāng)詳細(xì)和完整,包含大量示例。所以學(xué)習(xí)該模塊最好的教程就是官方文檔,argparse( https://docs.python.org/zh-cn/3/library/argparse.html),那么為什么我沒去看呢,一方面是我并不需要復(fù)雜的功能,另一方面我的英語閱讀能力不足以讓我完全理解該文檔。我們必須承認(rèn),英語水平分開了普通的技術(shù)人員,因此我正在努力提升英語水平。
在開發(fā)一個(gè)命令行工具前,我們首先需要知道一個(gè)命令行工具包含了哪些內(nèi)容,它又是怎么識(shí)別我們提供的參數(shù)的,識(shí)別后又是怎么提供輸出的,對待錯(cuò)誤的選項(xiàng),它又是如何調(diào)整的。
因此,官網(wǎng)使用了 ‘ls’ 這個(gè)命令來介紹命令行工具的幾個(gè)概念:
- ls 是一個(gè)即使在運(yùn)行的時(shí)候沒有提供任何選項(xiàng),也非常有用的命令。在默認(rèn)情況下他會(huì)輸出當(dāng)前文件夾包括的內(nèi)容。
- 如果我們想要使用比它默認(rèn)提供的更多功能,我們需要告訴該命令更多信息。我們可以指定所謂的位置參數(shù),之所以這樣命名,是因?yàn)槌绦驊?yīng)該如何處理該參數(shù)值,完全取決于它在命令行出現(xiàn)的文職。更能體現(xiàn)這個(gè)概念的命令如 cp ,它最基本的用法是
cp SRC DEST
,第一個(gè)位置參數(shù)指的是你想要復(fù)制的,第二個(gè)位置參數(shù)指的是你想要復(fù)制到的位置。 - 現(xiàn)在假設(shè)我們想要改變這個(gè)程序的行為。使用 **ls -l ,**我們可以輸出更多的信息,在這個(gè)例子中,-l 被稱為可選參數(shù)。
- **–help **通常被用來輸出幫助文檔,它是非常有用的,因?yàn)楫?dāng)你遇到一個(gè)你從未使用過的程序時(shí),你可以通過閱讀它的幫助文檔來弄清楚它是如何運(yùn)行的。
了解了這些,我們通過幾個(gè)例子可以更好的說明這個(gè)模塊是如何解析從命令行獲取的參數(shù)的,并且解析出的參數(shù)又是如何被程序使用的。
基礎(chǔ)
命令行參數(shù)解析很容易,但是它也可以被加入很多參數(shù),注入很多定義,這讓最后的程序變得不堪入目,為了防止我的朋友,也就是你,在開始就頭痛,我首先帶來一個(gè)我認(rèn)為最簡單的案例。
示例
所有解析都應(yīng)當(dāng)配有示例,并展示對比來說明程序的行為有哪些改變。
argparse使用主要有四個(gè)步驟:
- 導(dǎo)入argparse包
- 創(chuàng)建 ArgumentParser() 參數(shù)對象
- 調(diào)用 add_argument() 方法往參數(shù)對象中添加參數(shù)
- 使用 parse_args() 解析添加參數(shù)的參數(shù)對象,獲得解析對象
- 程序其他部分,當(dāng)需要使用命令行參數(shù)時(shí),使用解析對象.參數(shù)獲取
在未使用argparse模塊前,我編寫了這樣一個(gè)python文件。
print("hello world!")
我們很熟悉這個(gè)案例,毫無疑問我們清楚python運(yùn)行該文件時(shí)會(huì)得到什么樣的輸出,當(dāng)我們在終端運(yùn)行這個(gè)python文件demo1時(shí),我們會(huì)使用以下命令。
$ python demo1.py hello world!
是的,我們看到在命令行中,運(yùn)行該文件輸出了我們想要的結(jié)果,一般情況下,我們需要python文件輸出某個(gè)值時(shí),要么我們將該值在文件中寫死,就像上面這個(gè)例子一樣,我們已經(jīng)在文件中將想要的輸出寫死在文件中,這個(gè)值在未被輸出時(shí)就已經(jīng)在程序中被決定。如果我們需要用戶在終端中向程序提供某些值,來改變程序的行為,得到不同的輸出,我們常用的手段是使用input,讓程序讀入終端的輸入來達(dá)到這樣的效果。不過這樣做仍然需要手動(dòng)的輸入,如果是自動(dòng)化程序,那么可以使用參數(shù)直接帶入需要的變量將大大減少這樣的交互。
接下來我將演示如何使用argparse來完成一個(gè)簡單的參數(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)行一下這個(gè)程序
$ python demo1.py helloworld helloworld
很簡單,這是一個(gè)容易的例子,需要注意的是,由于沒有指定,所以命令行參數(shù)輸入默認(rèn)按順序復(fù)制,順序不同的話得到的結(jié)果將不同。
接下來我將帶入一些官網(wǎng)上的案例,來繼續(xù)解釋argparse的一些進(jìn)階示例。
使用介紹
- –help 選項(xiàng),也可縮寫為 -h,是唯一一個(gè)可以直接使用的選項(xiàng)(即不需要指定該選項(xiàng)的內(nèi)容)。指定任何內(nèi)容都會(huì)導(dǎo)致錯(cuò)誤。即便如此,我們也能直接得到一條有用的用法信息。
add_argument()方法,定義如何解析命令行參數(shù),對于該方法,參數(shù)解釋如下:
- name or flags - 選項(xiàng)字符串的名字或者列表,例如 foo 或者 -f, --foo。
- action - 命令行遇到參數(shù)時(shí)的動(dòng)作,默認(rèn)值是 store。
- store_const,表示賦值為const;
- – append,將遇到的值存儲(chǔ)成列表,也就是如果參數(shù)重復(fù)則會(huì)保存多個(gè)值;
- – append_const,將參數(shù)規(guī)范中定義的一個(gè)值保存到一個(gè)列表;
- – count,存儲(chǔ)遇到的次數(shù);此外,也可以繼承 argparse.Action 自定義參數(shù)解析;
- nargs - 應(yīng)該讀取的命令行參數(shù)個(gè)數(shù),可以是
- 具體的數(shù)字,或者是?號,當(dāng)不指定值時(shí)對于 Positional argument 使用 default,對于 Optional argument 使用 const
- 或者是 * 號,表示 0 或多個(gè)參數(shù);
- 或者是 + 號表示 1 或多個(gè)參數(shù)。
- const - action 和 nargs 所需要的常量值。
- default - 不指定參數(shù)時(shí)的默認(rèn)值。
- type - 命令行參數(shù)應(yīng)該被轉(zhuǎn)換成的類型。
- choices - 參數(shù)可允許的值的一個(gè)容器。
- required - 可選參數(shù)是否可以省略 (僅針對可選參數(shù))。
- help - 參數(shù)的幫助信息,當(dāng)指定為 argparse.SUPPRESS 時(shí)表示不顯示該參數(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è)置
需要一個(gè)必選參數(shù)時(shí),則設(shè)置required=True
,這時(shí),無論參數(shù)是否時(shí)可選參數(shù),都必須輸入
列表參數(shù)傳入設(shè)置
添加narg='+'
這樣可以在命令行中添加若干個(gè)參數(shù),傳入后將被添加到列表中。
互斥參數(shù)
也就是add_mutually_exclusive_group
方法,這讓我們可以添加兩個(gè)互相排斥的參數(shù),也就是只能選擇其中一個(gè)參數(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)文章
Python中的異常處理相關(guān)語句基礎(chǔ)學(xué)習(xí)筆記
這里我們簡單整理一下Python中的異常處理相關(guān)語句基礎(chǔ)學(xué)習(xí)筆記,包括try...except與assert等基本語句的用法講解:2016-07-07Python實(shí)現(xiàn)新型冠狀病毒傳播模型及預(yù)測代碼實(shí)例
在本篇文章里小編給大家整理的是關(guān)于Python實(shí)現(xiàn)新型冠狀病毒傳播模型及預(yù)測代碼內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-02-02利用Anaconda完美解決Python 2與python 3的共存問題
Anaconda 是 Python 的一個(gè)發(fā)行版,如果把 Python 比作 Linux,那么 Anancoda 就是 CentOS 或者 Ubuntu,下面這篇文章主要給大家介紹了利用Anaconda完美解決Python 2與python 3共存問題的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒。2017-05-05python通過Seq2Seq實(shí)現(xiàn)閑聊機(jī)器人
這篇文章主要介紹了python通過Seq2Seq實(shí)現(xiàn)閑聊機(jī)器人,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04使用Python給頭像加上圣誕帽或圣誕老人小圖標(biāo)附源碼
圣誕的到來給大家?guī)硐矏?,今天圣誕老人給大家送一頂圣誕帽,今天小編通過代碼給大家分享使用Python給頭像加上圣誕帽或圣誕老人小圖標(biāo)附源碼,需要的朋友一起看看吧2019-12-12Django使用jinja2模板的實(shí)現(xiàn)
本文主要介紹了Django使用jinja2模板的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02