最近開發Python程序需要使用命令行參數,於是查閱了以下標准庫,發現了argparse。。。
argparse模塊使得編寫用戶友好的命令行接口非常容易。程序只需定義好它要求的參數,然后argparse將負責如何從sys.argv中解析出這些參數。argparse模塊還會自動生成幫助和使用信息並且當用戶賦給程序非法的參數時產生錯誤信息。
argparse是python用於解析命令行參數和選項的標准模塊,用於代替已經過時的optparse模塊。
import argparse # 首先導入該模塊;
parser = argparse.ArgumentParser() # 然后創建一個解析對象
# 然后向該對象中添加你要關注的命令行參數和選項,每一個add_argument方法對應一個你要關注的參數或選項;
parser.add_argument()
;最后調用parse_args()方法進行解析;解析成功之后即可使用
args = parser.parse_args()
class argparse.ArgumentParser(
prog=None,
usage=None,
description=None,
epilog=None,
parents=[],
formatter_class=argparse.
HelpFormatter,
prefix_chars='-',
fromfile_prefix_chars=None,
argument_default=None,
conflict_handler='error',
add_help=True)
創建一個新的ArgumentParser對象。所有的參數應該以關鍵字參數傳遞。下面有對每個參數各自詳細的描述
參數 | 描述 |
---|---|
prog | 程序的名字(默認:sys.argv[0]) |
usage | 描述程序用法的字符串(默認:從解析器的參數生成) |
description | 參數幫助信息之前的文本(默認:空) |
epilog | 參數幫助信息之后的文本(默認:空) |
parents | ArgumentParser 對象的一個列表,這些對象的參數應該包括進去 |
formatter_class | 定制化幫助信息的類 |
prefix_chars | 可選參數的前綴字符集(默認:‘-‘) |
fromfile_prefix_chars | 額外的參數應該讀取的文件的前綴字符集(默 |
argument_default | 參數的全局默認值(默認:None) |
conflict_handler | 解決沖突的可選參數的策略(通常沒有必要) |
add_help | 給解析器添加-h/–help 選項(默認:True) |
ArgumentParser.add_argument(
name or flags...
[, action]
[, nargs]
[, const]
[, default]
[, type]
[, choices]
[, required]
[, help]
[, metavar]
[, dest])
定義應該如何解析一個命令行參數。下面每個參數有它們自己詳細的描述,簡單地講它們是:
參數 | 描述 |
---|---|
name or flags | 選項字符串的名字或者列表,例如foo 或者-f, –foo |
action | 在命令行遇到該參數時采取的基本動作類型。 |
nargs | 應該讀取的命令行參數數目。 |
const | 某些action和nargs選項要求的常數值。 |
default | 如果命令行中沒有出現該參數時的默認值。 |
type | 命令行參數應該被轉換成的類型。 |
choices | 參數可允許的值的一個容器。 |
required - 該命令行選項是否可以省略(只針對可選參數)。 | |
help | 參數的簡短描述。 |
metavar | 參數在幫助信息中的名字。 |
dest | 給parse_args()返回的對象要添加的屬性名稱。 |
#!/usr/bin/env python
# encoding: utf-8
# echo.py
import sys
if __name__ == "__main__":
print "您運行程序時輸入的運行信息有 %s, 類型 %s" % (sys.argv, len(sys.argv))
print "命令行參數的長度", len(sys.argv)
print "輸出每一個參數的信息"
for i, eachArg in enumerate(sys.argv):
print "[%d] = %s" % (i, eachArg)
運行結果如下!
#!/usr/bin/env python
# encoding: utf-8
import sys
import argparse
if __name__ == "__main__":
parser = argparse.ArgumentParser()
# 設置dest = "echo"以后
# 我們的parser可以從參數中讀取出名為echo的參數
# 我們在使用parse_args( )讀取參數信息后,可以直接用args.echo讀取該參數
parser.add_argument(dest = "echo", help = "echo the string you use here")
args = parser.parse_args()
print "程序運行的所有參數信息"
print "參數信息", args
print "參數類型", type(args)
print "顯示字符串echo = ", args.echo # 直接使用args.echo 即可讀取參數的信息
上面的代碼,我們的程序可以接收一個名為echo參數,然后我們讀取了該參數以后,會在后面打印出該參數的信息,因此該程序的功能其實就是linux中echo命令的功能,只不過我們在之前打印了以下參數的信息而已
注意我們的python程序可以使用兩種方式運行,
python echo.py
或者./echo.py
這里我們的需要知道的時,python是不作為參數的,argv[0]就是指向我們的文件名 / 程序名的。
其中help參數指定的是參數的幫助信息,運行-h
或者--help
我們可以看到運行參數的幫助信息。
#!/usr/bin/env python
# encoding: utf-8
import sys
import argparse
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(dest = "m", help = "pleaer enter the m...")
parser.add_argument(dest = "n", help = "pleaer enter the n...")
args = parser.parse_args()
print "%d ^ %d = %d" % (args.m, args.n, args.m ** args.n)
首先運行幫助,我們看看需要輸入哪些參數
我們可以看到運行的示例是square.py m n
於是我們輸入python square.py 5 2
我們從命令行中取出的參數默認是str類型的,不能進行數學運算,因此我們需要進行一個轉換,可以使用int()函數將字符串轉換為整形,但是我們的argparser提供了更好的方法,那就是add_argument函數的type參數
#!/usr/bin/env python
# encoding: utf-8
import sys
import argparse
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(dest = "m", help = "pleaer enter the m...", type = int)
parser.add_argument(dest = "n", help = "pleaer enter the n...", type = int)
args = parser.parse_args()
print "%d ^ %d = %d" % (args.m, args.n, args.m ** args.n)
現在程序的運行結果如下所示
但是這仍然不夠,我們見過很多命令行的程序,人家的參數不是這樣指定的,是有選項-u -p -s
來指定的。
請看下面的程序
#!/usr/bin/env python
# encoding: utf-8
import sys
import argparse
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-m", "--m_number", dest = "m", help = "pleaer enter the m...", type = int)
parser.add_argument("-n", "--n_number", dest = "n", help = "pleaer enter the n...", type = int)
args = parser.parse_args()
print "%d ^ %d = %d" % (args.m, args.n, args.m ** args.n)
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。