python argparse nargs_Python | 使用argparse解析命令行參數

今天是Python專題第27篇文章,我們來聊聊Python當中的命令行參數工具argparse。

命令行參數工具是我們非常常用的工具,比如當我們做實驗希望調節參數的時候,如果參數都是通過硬編碼寫在代碼當中的話,我們每次修改參數都需要修改對應的代碼和邏輯顯然這不太方便。比較好的辦法就是把必要的參數設置成通過命令行傳入的形式,這樣我們只需要在運行的時候修改參數就可以了。

sys.argv

解析命令行傳入參數最簡單的辦法就是通過sys.argv,sys.argv可以獲取到我們通過命令行傳入的參數。

import?sys

print(sys.argv)

用法很簡單,只需要調用sys.argv即可。argv是一個數組,如果參數有多個,我們可以通過下標進行訪問。但是有一點需要注意,argv當中存儲的結果是從Python調用開始的。

我們來看一個例子,我們隨意傳入一些參數,print sys.argv之后是這樣的。

python?test.py?-a?-c?-d=222

>>>['test.py',?'-a',?'-c',?'-d=222']

也就是說我們python運行test.py這個文件名也當做參數之一,所以我們要獲取自定義參數的話需要從argv[1]開始。

sys.argv的好處是方便,我們只需要訪問它就可以拿到傳入的參數了。但是缺點也很明顯,就是功能太少了。假如我們是看其他大神的代碼,我們想要知道運行的時候需要傳入什么參數,以及每個參數代表什么含義就做不到了。

為了解決這個問題,我們需要使用封裝更多功能的工具,也是本篇文章的核心——argparse。

基本用法

argparse是Python當中的一個庫,我們需要先import一下,這個庫我沒記錯應該是Python自帶的,也不需要安裝,我們直接就可以使用。

在我們使用之前,我們需要先初始化這個parse,也就是一個參數解析器。

#?這里ArgumentParser可以傳入一個字符串,表示用途

parser?=?argparse.ArgumentParser()

parser.parse_args()

這個時候其實就已經有了一個解析器了,我們在運行的時候可以傳入參數-h,表示help,也就是查看目前解析器當中定義的參數。由于我們現在什么也沒有,所以能顯示出來的就只有help。

必選參數

首先我們來介紹必選參數,它的定義和函數當中的必填參數是一樣的,也就是說我們運行程序必須要的參數。如果不傳,那么程序不應該執行會進行報錯并提示。

定義必選參數的方法非常簡單,我們只需要通過add_argument傳入參數的名稱就可以了。

import?argparse

parser?=?argparse.ArgumentParser("For?test?the?parser")

parser.add_argument('test')

args?=?parser.parse_args()

print(args.test)

這樣我們就定義了一個名叫test的參數,我們可以通過args.test來訪問它。

這個時候我們再運行python test.py -h就會發現提示的信息當中多了一行:

告訴我們必選參數當中有test,必選參數直接傳入,不需要加上前綴。所以我們執行的時候直接python test.py xxx就可以了。

可選參數

有必選參數當然就有可選參數,可選參數由于可選可不選, 所以我們在使用的時候需要在參數前加上標識-或者--。比如我們參數名叫做test,可以定義成-test或者--test,這兩種都可以,也可以這兩種都定義。

parser.add_argument('-test',?'--test')

我們運行-h可以發現optional arguments當中多了test和--test。

但是這個只print出來了參數名,并沒有告訴我們這個參數究竟是做什么的,像是help參數后面就跟了show this help message and exit這個提示語。如果我們也希望help能夠提示我們參數的作用怎么辦呢?

我們可以通過help參數傳入我們希望打印出來的提示語,這樣方便使用者在使用的時候了解參數的情況。

比如我們把這行語句改成:

parser.add_argument('-test',?'--test',?help='just?for?help')

這樣當我們運行的時候,就會看到提示語了:

默認值

如果參數很多的時候,我們有時候可能不希望每一個都指定一個值,而是希望可以在不填的時候有一個默認值。這個想法非常正常,想要做到這點也很簡單,我們可以通過default參數來指定。

import?argparse

parser?=?argparse.ArgumentParser("For?test?the?parser")

parser.add_argument('-test',?'--test',?default=1,?help='just?for?help')

args?=?parser.parse_args()

print(args.test)

比如這樣我們在代碼當中把test參數的默認值設置成了1,當我們運行的時候,如果不填test這個參數的話,那么程序就會使用它的默認值也就是1。

但有一點默認值的信息并不會print在help當中,所以我們需要自己在提示語當中告知使用者默認值是多少。

type

我們可以定義參數的默認值,當然也可以定義它的類型。

因為命令行傳入的參數默認都是字符串,如果我們要進行數學上的計算,使用str還需要自己轉換,這就很不方便。我們可以在傳入參數的時候就完成類型的匹配,這樣如果傳入參數的類型不對, 那么直接報錯,不往下運行。

想要做到這點也很簡單,通過type參數就可以實現。

parser.add_argument('-test',?'--test',?default=1,?type=int,?help='just?for?help')

比如當我們定義了一個int型的參數,而傳入的是類型不匹配的話,那么就會引起報錯:

報錯信息當中寫得很清楚,我們得到了一個無效的int的值,它是abc。

可選值

它同樣還支持可選值,可選值很好理解,就是我們希望限定傳入參數的范圍僅僅在幾個值當中。比如說我們希望傳入的值不是0就是1,或者是在某幾個具體的值當中,這個時候我們可以通過choices參數來實現這一點。

choices參數傳入的是一個list,也就是我們的限定范圍,只有在這個范圍當中的值才被允許。

parser.add_argument('-test',?'--test',?default=1,?choices=[2,?3,?4],?type=int,?help='just?for?help')

如果我們運行傳入test=1,那么就會引起報錯,告訴我們傳入的值不在choices范圍當中。

這是一個挺有意思的例子,仔細看會發現我們默認值設置成了1,但是可選值當中并沒有1。這也是允許的,默認值可以不在可選值范圍內,但是當我們傳入1就會觸發可選值校驗。

action

action是一個很神奇也很有用的操作,可以指定參數的處理方式。我們默認的方式是store,也就是存儲的意思,這個我們都能理解。除此之外,還有store_true,它表示出現則是true,否則是false。

parser.add_argument('-test',?'--test',?action='store_true',?help='just?for?help')

當我們把test參數的定義改成這樣之后,我們來對比一下運行的結果就明白了。

除了store_true之外還有store_const,也就是說出現就指定為一個固定值。

parser.add_argument('-test',?'--test',?action='store_const',?const=23,?help='just?for?help')

這樣當我們指定-test參數之后,它會自動被賦值成23。

除了這兩個之外,另外一個很常用的參數是append,可以將多次出現的同一個參數自動存入一個list當中。

parser.add_argument('-test',?'--test',?action='append',?type=int,?help='just?for?help')

nargs

nargs也是一個非常有用的參數,可以對參數進行一些花式操作。nargs的傳入參數有以下幾種,首先是N,也就是一個整數。代表可以接收N個參數值,這N個值會被存入一個list當中。

parser.add_argument('-test',?'--test',?nargs=2,?type=int,?help='just?for?help')

另外一種傳入的參數是'+'或者是'*',它可以將任意多個值存入一個list當中。

parser.add_argument('-test',?'--test',?nargs='*',?type=int,?help='just?for?help')

總結

有了parser之后,我們在Python當中處理命令行參數會變得非常簡單,我們可以做各種各樣的定制化操作。除了我們上面介紹的之外,還有一些其他的做法,相對來說不是非常常用,所以就不一一窮盡了,感興趣的同學可以自行了解一下。

今天的文章到這里就結束了,如果喜歡本文的話,請來一波素質三連,給我一點支持吧(關注、轉發、點贊)。

- END -

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454041.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454041.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454041.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python 第三方模塊之 smtplib

1 python對SMTP的支持 SMTP(Simple Mail Transfer Protocol)是簡單傳輸協議,它是一組用于用于由源地址到目的地址的郵件傳輸規則。 python中對SMTP進行了簡單的封裝,可以發送純文本郵件、HTML郵件以及帶附件的郵件。兩個核心模塊…

Node.js 使用jQuery取得Nodejs http服務端返回的JSON對象示例

server.js代碼: // 內置http模塊,提供了http服務器和客戶端功能(path模塊也是內置模塊,而mime是附加模塊) var httprequire("http");// 創建服務器,創建HTTP服務器要調用http.createServer()函數&#xff0c…

linux下gdb單步調試

用 GDB調試程序 GDB 概述 ———— GDB 是 GNU開源組織發布的一個強大的 UNIX下的程序調試工具。或許,各位比較喜歡那種圖形界面方式的,像 VC、 BCB等 IDE的調試,但如果你是在 UNIX平臺下做軟件,你會發現 GDB這個調試工具有比 V…

svg 動畫_根據AI導出的SVG path制作SVG線條動畫

點擊右上方紅色按鈕關注“web秀”,讓你真正秀起來前言首先祝大家2019新年快樂,萬事大吉,豬事順利,闔家歡樂。前面文章SVG 線條動畫基礎入門知識學習到了基礎知識,現在來給大家講講如何制作SVG 制作復雜圖形線條動畫。假…

MySQL提示Truncated incorrect DOUBLE value解決方法

“Truncated incorrect DOUBLE value”的解決方法主要是這兩種: 1、修改了多個列的值而各列之間用逗號連接而不要用and 錯誤寫法示例:update tablename set col1value1 and col2value2 where col3value3;正確寫法示例:update ta…

一個完美的導航樹

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml" ><head><title>無標題頁</title><…

自定義python框架_Python web 框架Sanic 學習: 自定義 Exception

Sanic 是一個和類Flask 的基于Python3.5的web框架&#xff0c;它使用了 Python3 異步特性&#xff0c;有遠超 flask 的性能。編寫 RESTful API 的時候&#xff0c;我們會定義特定的異常錯誤類型&#xff0c;比如我定義的錯誤返回值格式為&#xff1a;{"error_code": …

文字水印

using System.Threading.Tasks;using System.IO;using System.Drawing; public static int Shuy(string Sname,string fname) { try { Image image Image.FromFile(fname); Graphics gra Graphics.FromImage(image); String text Sname; Font font new Font("宋體&quo…

讀書筆記2013第3本:《無價》

《無價》這本書是過年前買的&#xff0c;網絡書店上寫著“老羅推薦”&#xff0c;想著好像是在老羅哪一年的演講里聽過這本書&#xff0c;在豆瓣上評分7.9。讀書是為了產生行動&#xff0c;讀書時要提的4個問題&#xff0c;1&#xff09;這本書主要在談些什么&#xff1f;2&…

Linux下的程序調試——GDB

無論是多么優秀的程序員&#xff0c;都難以保證自己在編寫代碼時不會出現任何錯誤&#xff0c;因此調試是軟件開發過程中的一個必不可少的 組成部分。當程序完成編譯之后&#xff0c;它很可能無法正常運行&#xff0c;或者會徹底崩潰&#xff0c;或者不能實現預期的功能。此時如…

圓錐曲線萬能弦長公式_2020高考數學50條秒殺型公式與方法

考試馬上就要到了&#xff0c;學姐整理了高考數學50條秒殺型公式和方法&#xff0c;希望能幫助考生們更好地攻克數學難關&#xff01;高考數學秒殺公式與方法一1&#xff0c;適用條件&#xff1a;[直線過焦點]&#xff0c;必有ecosA(x-1)/(x1)&#xff0c;其中A為直線與焦點所在…

Python 內置模塊之 logging

日志的級別和適用情況 級別適用情況DEBUG詳細信息&#xff0c;通常只在診斷問題時對其感興趣INFO確認工作正常WARNING表示發生了意料之外的事或者在不遠的將來會有問題&#xff08;比如磁盤空間低&#xff09;。軟件依然正常工作ERROR由于一個更加嚴重的問題&#xff0c;軟件不…

Memory barrier

待續 Memory barrier,是一種屏障和一類指令&#xff0c;在執行這個屏障指令前后&#xff0c;CPU或者編譯器在內存操作上強制一個約束序列。CPU使用性能優化器可以導致執行代碼的無序。在單一線程執行中&#xff0c;重排序內存操作通常不會被注意。但是在并行編程或者設備驅動中…

數據結構與算法 Python語言描述 筆記

數據結構 線性表包括順序表和鏈表&#xff0c;python的list是順序表&#xff0c;鏈表一般在動態語言中不會使用。不過鏈表還是會出現在各種算法題中。 鏈表 link list 單鏈表 逆轉鏈表&#xff1a; leetcode 206雙鏈表循環單鏈表字符串 string 有一個重要的點就是字符串的匹配問…

Flask 跨域問題

一、什么是跨域 跨域是指&#xff1a;瀏覽器A從服務器B獲取的靜態資源&#xff0c;包括Html、Css、Js&#xff0c;然后在Js中通過Ajax訪問C服務器的靜態資源或請求。即&#xff1a;瀏覽器A從B服務器拿的資源&#xff0c;資源中想訪問服務器C的資源。 同源策略是指&#xff1a;…

Hibernate 中配置屬性詳解(hibernate.properties)

轉自&#xff1a;https://blog.csdn.net/shudaqi2010/article/details/70324843 Hibernate能在各種不同環境下工作而設計的, 因此存在著大量的配置參數。多數配置參數都 有比較直觀的默認值, 并有隨 Hibernate一同分發的配置樣例hibernate.properties 來展示各種配置選項。 所需…

1.3 使用電腦測試MC20的電話語音功能

需要準備的硬件 MC20開發板 1個https://item.taobao.com/item.htm?id562661881042GSM/GPRS天線 1根https://item.taobao.com/item.htm?id531979567261IPEX接口轉SMA接口轉接線 1根https://item.taobao.com/item.htm?id531979903836GPS有源天線 1根https://item.taobao.com/i…

前端之 AJAX

AJAX參數詳細列表 參數名類型描述urlString(默認: 當前頁地址) 發送請求的地址。typeString(默認: "GET") 請求方式 ("POST" 、 "GET")。注意&#xff1a;其它 HTTP 請求方法&#xff0c;如 PUT 和 DELETE &#xff0c;但僅部分瀏覽器支持。tim…

buffer 和cache的區別

Cache&#xff1a;高速緩存&#xff0c;是位于CPU與主內存間的一種容量較小但速度很高的存儲器。 由于CPU的速度遠高于主內存&#xff0c;CPU直接從內存中存取數據要等待一定時間周期&#xff0c;Cache中保存著CPU剛用過或循環使用的一部分數據&#xff0c;當CPU再次使用該部分…

html5--1.18 div元素與布局

1.18 div元素與布局 1.元素的分類2.div元素與布局 1、元素的分類 塊元素:主要特征是會產生換行效果&#xff0c;自動與其他元素分離成兩行&#xff1b;通常可以作為容器在內部添加其他元素。已經學過的塊元素有&#xff1a; h1~h6;hr;ul;ol;p;table......... 內聯元素:不會產生…