argparse 模塊
一個可執行檔案或者腳本都可以接收引數,
$ ls -l /etc
/etc 是位置引數
-l 是短選項
如何把這些引數傳遞給程式呢?
從3.2開始Python提供了功能強大的引數分析的模塊argparse,
1.引數分類
引數分為:
- 位置引數,引數放在那里,就要對應一個引數位置,例如/etc就是對應一個引數位置,
- 選項引數,必須通過前面是 - 的短選項或者 -- 的長選項,然后后面的才算該選項的引數,當然選項后面也可以沒有引數,
上例中,/etc對應的是位置引數,-l是選項引數,
ls -alh src
2.基本決議
先來一段最簡單的程式
import argparse
parser = argparse.ArgumentParser() # 獲得一個引數決議器
args = parser.parse_args() # 分析引數
parser.print_help() # 列印幫助
運行結果
$ python test.py -h
usage: test1.py [-h]
optional arguments:
-h, --help show this help message and exit
argparse不僅僅做了引數的定義和決議,還自動幫助生成了幫助資訊,尤其是usage,可以看到現在定義的引數是否是自己想要的,
3.決議器的引數
| 引數名稱 | 說明 |
|---|---|
| prog | 程式的名字,預設使用 sys.argv[0] 的 basename |
| add_help | 自動為決議器增加 -h 和 --help 選項,默認為True |
| description | 為程式功能添加描述 |
- parser = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
$ python test.py --help
usage: ls [-h]
list directory contents
optional arguments:
-h, --help show this help message and exit
4.位置引數決議
ls 基本功能應該解決目錄內容的列印,
列印的時候應該指定目錄路徑,需要位置引數,
import argparse
# 獲得一個引數決議器
parser = argparse.ArgumentParser(prog='ls', add_help=True, description='list
directory contents')
parser.add_argument('path')
args = parser.parse_args() # 分析引數
parser.print_help() # 列印幫助
# 運行結果,出現了錯誤,提示需要輸入path對應的位置引數
usage: ls [-h] path
ls: error: the following arguments are required: path
程式定義為:
ls [-h] path
-h為幫助選項,可有可無
path為位置引數,必須提供
傳參
parse_args(args=None, namespace=None)
args 引數串列,一個可迭代物件,內部會把可迭代物件轉換成list,如果為None則使用命令列傳入引數,非None則使用args引數的可迭代物件,
import argparse
# 獲得一個引數決議器
parser = argparse.ArgumentParser(prog='ls', add_help=True, description='list
directory contents')
parser.add_argument('path') # 位置引數
args = parser.parse_args(('/etc',)) # 分析引數,同時傳入可迭代的引數
print(args, args.path) # 列印名詞空間中收集的引數
parser.print_help() # 列印幫助
運行結果
Namespace(path='/etc') /etc
usage: ls [-h] path
list directory contents
positional arguments:
path
optional arguments:
-h, --help show this help message and exit
Namespace(path='/etc')里面的path引數存盤在了一個Namespace物件內的屬性上,可以通過
Namespace物件屬性來訪問,例如args.path
非必須位置引數
上面的代碼必須輸入位置引數,否則會報錯,
usage: ls [-h] path
ls: error: the following arguments are required: path
但有時候,ls命令不輸入任何路徑的話就表示列出當前目錄的檔案串列,
import argparse
# 獲得一個引數決議器
parser = argparse.ArgumentParser(prog='ls', add_help=True, description='list
directory contents')
parser.add_argument('path', nargs='?', default='.', help="path help") # 位置
引數,可有可無,預設值,幫助
args = parser.parse_args() # 分析引數,同時傳入可迭代的引數
print(args) # 列印名詞空間中收集的引數
parser.print_help() # 列印幫助
# 運行結果
Namespace(path='.')
usage: ls [-h] [path]
list directory contents
positional arguments:
path path help
optional arguments:
-h, --help show this help message and exit
可以看出path也變成可選的位置引數,沒有提供就使用默認值 .點號 表示當前路徑,
help 表示幫助檔案中這個引數的描述
nargs 表示這個引數接收結果引數
- ? 表示可有可無
- +表示至少一個
- *可以任意個
- 數字表示必須是指定數目個
default 表示如果不提供該引數,就使用這個值,一般和?、*配合,因為它們都可以不提供位置引數,不提供就用預設值
5.選項引數
-l的實作
parser.add_argument('-l') 就增加了選項引數,引數定義為
ls [-h][-l L] [path]
和我們要的形式有一點出入,我們期望的是 [-l] ,怎么解決?
nargs能夠解決嗎?
parser.add_argument('-l', nargs='?')
ls [-h][-l [L]] [path]
-l還不是可選引數,
那么,直接把nargs=0,意思就是讓這個選項接收0個引數,如下
parser.add_argument('-l', nargs=0)
結果,拋出例外
raise ValueError('nargs for store actions must be > 0; if you '
ValueError: nargs for store actions must be > 0; if you have nothing to store, actions such as
store true or store const may be more appropriate
看來nargs是控制位置引數和選項引數的,不能影響選項引數的引數,
為了這個問題,使用action引數
parser.add_argument('-l', action='store_true')
看到命令定義變成了 ls [-h][-l] [path]
提供-l選項,例如
- ls -l 得到Namespace(l=True, path='.'),提供-l值是True
- ls 得到Namespace(l=False, path='.'),未提供-l值是False
這樣同True、False來判斷用戶是否提供了該選項
parser.add_argument('-l', action='store_const', const = 20)
# 提供-l選項,屬性值為20;否則,對應值為None
-a的實作
parser.add_argument('-a', '--all', action='store_true') # 長短選項同時給
6.屬性名稱
引數都是Namespace物件的屬性,如果想指定這些屬性名,可以使用dest,
parser.add_argument('-l', action='store_true', dest='longfmt')
7.示例
import argparse
# 獲得一個引數決議器
parser = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
# 位置引數,可有可無,預設值,幫助
parser.add_argument('path', nargs='?', default='.', help='directory')
parser.add_argument('-l', action='store_true', dest='longfmt', help='use along listing format')
parser.add_argument('-a', '--add', action='store_true', help='show all file,do not ignore entrues starting with .')
# 分析引數,同時傳入可迭代的引數
args = parser.parse_args()
# 列印名稱空間中收集的引數
print(args)
# 列印幫助
parser.print_help()
# Python學習交流QQ群:153708845
# 輸出
Namespace(path='.', longfmt=False, add=False)
usage: ls [-h] [-l] [-a] [path]
list directory contents
positional arguments:
path directory
options:
-h, --help show this help message and exit
-l use along listing format
-a, --add show all file,do not ignore entrues starting with .
8.練習
實作ls命令功能,實作-l、-a和--all、-h選項
實作顯示路徑下的檔案串列
-a和-all 顯示包含.開頭的檔案
-l 詳細串列顯示
-h 和-l配合,人性化顯示檔案大小,例如1K、1G、1T等,可以認為1G=1000M
型別字符
-
c 字符
-
d 目錄
-
普通檔案
-
l 軟鏈接
-
b 塊設備
-
s socket檔案
-
p pipe檔案,即FIFO
參看Linux、Unix命令ls -lah
-rw-rw-r-- 1 python python 5 Oct 25 00:07 test4
mode 硬鏈接 屬主 屬組 位元組 時間 檔案名
按照檔案名排序輸出,可以和ls的順序不一樣,但要求檔案名排序
要求詳細串列顯示時,時間可以按照“年-月-日 時:分:秒” 格式顯示,例如2015-06-17 17:05:00
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/541819.html
標籤:其他
