欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python的命令行參數(shù)實(shí)例詳解

 更新時間:2022年02月25日 12:47:14   作者:盼小輝丶  
python中有一個模塊sys,sys.argv這個屬性提供了對命令行參數(shù)的訪問,下面這篇文章主要給大家介紹了關(guān)于Python命令行參數(shù)實(shí)例的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

0. 命令行參數(shù)

通常,對于大型項(xiàng)目程序而言,執(zhí)行程序的一個必要的步驟是正確處理命令行參數(shù),這些命令行參數(shù)是提供給包含某種參數(shù)化信息的程序或腳本的參數(shù)。例如,在計算機(jī)視覺項(xiàng)目中,圖像和不同類型的文件通常作為命令行參數(shù)傳遞給腳本,用于使程序可以處理不同圖片或者不同類型文件。

命令行參數(shù)是參數(shù)化程序執(zhí)行的一種常見且簡單的方法,下面主要介紹三種常見的獲取和解析命令行參數(shù)的方法。

1. sys.argv

為了處理命令行參數(shù),Python 中內(nèi)置了 sys.argv 模塊,通過模塊中的 sys.argv 就可以訪問到所有的命令行參數(shù),它的返回值是包含所有命令行參數(shù)的列表 (list)。當(dāng)程序執(zhí)行時,Python 從命令行獲取所有值并將它們存儲在 sys.argv 列表中。列表的第一個元素 sys.argv[0] 是腳本的完整路徑(或腳本名稱——取決于具體操作系統(tǒng))。列表的第二個元素是腳本的第一個命令行參數(shù),即 sys.argv[1],依此類推。這可以通過下圖中清晰的看出,其中 script_1.py 腳本使用兩個參數(shù)執(zhí)行:

sys.argv

接下來,讓我們看看 sys.argv 是如何工作的,首先編寫 scripy_1.py 腳本:

import sys
print("正在運(yùn)行的腳本名稱: '{}'".format(sys.argv[0]))
print("腳本的參數(shù)數(shù)量: '{}'".format(len(sys.argv)))
print("腳本的參數(shù): '{}'".format(str(sys.argv)))

如果我們不使用任何參數(shù)執(zhí)行這個腳本:

python script_1.py

將會看到如下信息:

正在運(yùn)行的腳本名稱: 'script_1.py'
腳本的參數(shù)數(shù)量: '1'
腳本的參數(shù): '['script_1.py']'

如果我們使用多個參數(shù)執(zhí)行此腳本:

python script_1.py OpenCV -i test.png

將得到以下信息:

正在運(yùn)行的腳本名稱: 'script_1.py'
腳本的參數(shù)數(shù)量: '4'
腳本的參數(shù): '['script_1.py', 'OpenCV', '-i', 'test.png']'

如上所示,列表的第一個元素 script_1.py (sys.argv[0]) 是腳本名稱。列表的第二個元素 (sys.argv[1]) OpenCV 是腳本的第一個參數(shù)。但同時也可以看到,sys.argv 將命令行選項(xiàng) -i 也識別為參數(shù),這樣并不能方便的滿足我們的需求,因此引入 getopt 模塊來識別命令行選項(xiàng)。

2. getopt

getopt 模塊是專門處理命令行參數(shù)的模塊,用于獲取命令行選項(xiàng)和參數(shù)。命令行選項(xiàng)使得程序的參數(shù)更加靈活,其支持短選項(xiàng)模式(-)和長選項(xiàng)模式(–)。
該模塊提供了兩個方法及一個異常處理來解析命令行參數(shù)。

2.1 getopt.getopt 方法

getopt.getopt 方法用于解析命令行參數(shù)列表,其語法格式如下:

getopt.getopt(args, options[, long_options])

方法參數(shù)說明如下表所示:

參數(shù)說明
args要解析的命令行參數(shù)列表,一般是sys.argv[1:],需要過濾掉腳本名(sys.argv[0])
options以字符串的格式定義,options 后的冒號 “:” 表示如果設(shè)置該選項(xiàng),必須有附加的參數(shù),否則就不附加參數(shù)
long_options以列表的格式定義,long_options 后的等號 “=” 表示該選項(xiàng)必須有附加的參數(shù),不帶冒號表示該選項(xiàng)不附加參數(shù)

該方法返回值由兩個元素組成: 第一個是 (option, value) 元組的列表。 第二個是參數(shù)列表,包含那些沒有 - 或 – 的參數(shù)。
下面編寫 script_2.py 腳本進(jìn)行演示:

import sys
import getopt

def main(argv):
    input_file = ""
    output_file = ""
    # "hi:o:": 短格式分析串, h 后面沒有冒號, 表示后面不帶參數(shù); i 和 o 后面帶有冒號, 表示后面帶參數(shù)
    # ["help", "input_file=", "output_file="]: 長格式分析串列表, help后面沒有等號, 表示后面不帶參數(shù); input_file和output_file后面帶冒號, 表示后面帶參數(shù)
    # 返回值包括 `opts` 和 `args`, opts 是以元組為元素的列表, 每個元組的形式為: (選項(xiàng), 附加參數(shù)),如: ('-i', 'test.png');
    # args是個列表,其中的元素是那些不含'-'或'--'的參數(shù)
    opts, args = getopt.getopt(argv[1:], "hi:o:", ["help", "input_file=", "output_file="])

    for opt, arg in opts:
        if opt in ("-h", "--help"):
            print('script_2.py -i <input_file> -o <output_file>')
            print('or: test_arg.py --input_file=<input_file> --output_file=<output_file>')
            sys.exit()
        elif opt in ("-i", "--input_file"):
            input_file = arg
        elif opt in ("-o", "--output_file"):
            output_file = arg
    print('輸入文件為:', input_file)
    print('輸出文件為:', output_file)

    # 打印不含'-'或'--'的參數(shù)
    for i in range(0, len(args)):
        print('不含'-'或'--'的參數(shù) %s 為:%s' % (i + 1, args[i]))
        
if __name__ == "__main__":
    main(sys.argv)

使用帶有命令行選項(xiàng)的命令執(zhí)行此腳本,以下兩種方式是等價的:

# 方式1
python scripy_1.py -i test.png -o output.png OpenCV
# 方式2
python scripy_1.py --input_file test.png --output_file output.png OpenCV

輸出得到以下信息:

輸入文件為: test.png
輸出文件為: output.png
不含'-'或'--'的參數(shù) 1 為:OpenCV

2.2 Exception getopt.GetoptError

在參數(shù)列表中沒有找到所傳遞參數(shù),或選項(xiàng)的需要的參數(shù)為空時會觸發(fā)該異常。異常的參數(shù)是一個字符串,表示錯誤的原因。屬性 msg 和 opt 為相關(guān)選項(xiàng)的錯誤信息。
在上述代碼中添加異常處理,檢查此錯誤信息:

# ...
def main(argv):
    input_file = ""
    output_file = ""
    try:
        opts, args = getopt.getopt(argv[1:], "hi:o", ["help", "input_file=", "output_file="])
    except getopt.GetoptError as e:
        print(e.msg)
        print(e.opt)
        sys.exit(2)
# ...

使用錯誤的格式選項(xiàng)傳遞參數(shù)執(zhí)行腳本:

python scripy_1.py -f

輸出以下錯誤信息:

option -f not recognized
f

3. argparse

當(dāng)程序中使用采用復(fù)雜參數(shù)或多個文件名時,推薦使用 Python 的 argparse 庫,它以系統(tǒng)的方式處理命令行參數(shù),從而可以編寫用戶友好的命令行程序。Python 標(biāo)準(zhǔn)庫 argparse 同樣也是用于解析命令行參數(shù)的模塊。首先,由程序確定所需的參數(shù),然后, argparse 將這些參數(shù)解析為 sys.argv。此外,argparse 會生成幫助和使用信息提示,并在提供無效參數(shù)時發(fā)出錯誤。

為了介紹此模塊,編寫 script_3.py,如下所示:

import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

不帶參數(shù)運(yùn)行此腳本不會向 stdout 顯示任何內(nèi)容。但是,如果使用 --help 或 -h 選項(xiàng),將得到腳本的使用信息提示:

usage: scripy_3.py [-h]
optional arguments:
-h, --help show this help message and exit

指定其他參數(shù)會導(dǎo)致錯誤,例如使用如下命令:

scripy_3.py -i

則會報導(dǎo)致錯誤:

usage: scripy_3.py [-h]
argparse_minimal.py: error: unrecognized arguments: -i

由于未定義參數(shù),因此不允許其他參數(shù),接下來就添加一個參數(shù),編寫 script_4.py 腳本:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("first_argument", help="this is the string text in connection with first_argument")
args = parser.parse_args()
print(args.first_argument)

這里添加了 add_argument() 方法。此方法用于指定程序?qū)⒔邮苣男┟钚羞x項(xiàng),此處添加了 first_argument 參數(shù)。此外, argparse 模塊存儲所有參數(shù),將其名稱與每個添加參數(shù)的名稱相匹配——在此處為 first_argument 。為了獲得參數(shù)值,需要使用 args.first_argument。

如果此腳本以下示方法執(zhí)行,則輸出為 10:

python scripy_4.py 10

但如果腳本在沒有參數(shù)的情況下執(zhí)行,則將輸出以下信息:

usage: scripy_4.py [-h] first_argument
scripy_4.py: error: the following arguments are required: first_argument

最后,如果我們使用 -h 選項(xiàng)執(zhí)行腳本,輸出將如下所示:

usage: scripy_4.py [-h] first_argument

positional arguments:
  first_argument  this is the string text in connection with first_argument

optional arguments:
  -h, --help      show this help message and exit

默認(rèn)情況下,argparse 將提供的選項(xiàng)視為字符串。因此,如果參數(shù)不是字符串,則應(yīng)使用 type 選項(xiàng)。使用 script_5.py 腳本,其中添加了兩個參數(shù),這兩個參數(shù)是 int 類型:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("first_number", help="first number to be added", type=int)
parser.add_argument("second_number", help="second number to be added", type=int)
args = parser.parse_args()
print("args: '{}'".format(args))
print("the sum is: '{}'".format(args.first_number + args.second_number))
args_dict = vars(parser.parse_args())
print("args_dict dictionary: '{}'".format(args_dict))
print("first argument from the dictionary: '{}'".format(args_dict["first_number"]))

在前面的示例中,通過調(diào)用 vars() 函數(shù)將參數(shù)存儲在字典中:

args_dict = vars(parser.parse_args())
print("args_dict dictionary: '{}'".format(args_dict))
print("first argument from the dictionary: '{}'".format(args_dict["first_number"]))

如果不帶參數(shù)執(zhí)行腳本:

python script_5.py

則輸出如下:

usage: scripy_5.py [-h] first_number second_number
scripy_5.py: error: the following arguments are required: first_number, second_number

此外,如果我們使用 -h 選項(xiàng)執(zhí)行腳本:

python script_5.py --help

輸出將如下所示:

usage: scripy_1.py [-h] first_number second_number

positional arguments:
  first_number   first number to be added
  second_number  second number to be added

optional arguments:
  -h, --help     show this help message and exit

如果此腳本以如下方式執(zhí)行:

python script_5.py 123 456

則輸出如下:

args: 'Namespace(first_number=123, second_number=456)'
the sum is: '579'
args_dict dictionary: '{'first_number': 123, 'second_number': 456}'
first argument from the dictionary: '123'

更多 argparse 的高級介紹可以在官方文檔中看到,其中包括了大量示例

總結(jié)

到此這篇關(guān)于Python命令行參數(shù)詳解的文章就介紹到這了,更多相關(guān)Python命令行參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python常見庫matplotlib學(xué)習(xí)筆記之畫圖中各個模塊的含義及修改方法

    Python常見庫matplotlib學(xué)習(xí)筆記之畫圖中各個模塊的含義及修改方法

    matplotlib是python最著名的繪圖庫,它提供了一整套和matlab相似的命令A(yù)PI,十分適合交互式地進(jìn)行制圖,下面這篇文章主要給大家介紹了關(guān)于Python常見庫matplotlib學(xué)習(xí)筆記之畫圖中各個模塊的含義及修改方法的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • python偏函數(shù)的實(shí)例用法總結(jié)

    python偏函數(shù)的實(shí)例用法總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于python偏函數(shù)的實(shí)例用法總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-07-07
  • Django使用裝飾器限制對視圖的訪問及實(shí)現(xiàn)原理

    Django使用裝飾器限制對視圖的訪問及實(shí)現(xiàn)原理

    除了可以在視圖處理中校驗(yàn)用戶身份以及驗(yàn)證用戶權(quán)限之外,Django還提供了便捷的裝飾器來完成這兩類校驗(yàn),下面介紹這兩個裝飾器的使用方法與實(shí)現(xiàn)原理,對Django裝飾器限制視圖訪問相關(guān)知識感興趣的朋友一起看看吧
    2022-10-10
  • python寫入xml文件的方法

    python寫入xml文件的方法

    這篇文章主要介紹了python寫入xml文件的方法,涉及Python操作XML模塊實(shí)現(xiàn)針對XML文件操作的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • python3實(shí)現(xiàn)名片管理系統(tǒng)

    python3實(shí)現(xiàn)名片管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)名片管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • python中的內(nèi)置函數(shù)getattr()介紹及示例

    python中的內(nèi)置函數(shù)getattr()介紹及示例

    其實(shí)getattr()這個方法最主要的作用是實(shí)現(xiàn)反射機(jī)制。也就是說可以通過字符串獲取方法實(shí)例。這樣,你就可以把一個類可能要調(diào)用的方法放在配置文件里,在需要的時候動態(tài)加載。
    2014-07-07
  • python從內(nèi)存地址上加載python對象過程詳解

    python從內(nèi)存地址上加載python對象過程詳解

    這篇文章主要介紹了python從內(nèi)存地址上加載pythn對象過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • django學(xué)習(xí)之a(chǎn)jax post傳參的2種格式實(shí)例

    django學(xué)習(xí)之a(chǎn)jax post傳參的2種格式實(shí)例

    AJAX除了異步的特點(diǎn)外,還有一個就是:瀏覽器頁面局部刷新,下面這篇文章主要給大家介紹了關(guān)于django學(xué)習(xí)之a(chǎn)jax post傳參的2種格式的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • 基于python編寫的shell腳本詳細(xì)講解

    基于python編寫的shell腳本詳細(xì)講解

    python相對于linux的shell腳本來說更簡單,功能更強(qiáng)大,代碼量也少很多,這里就為大家分享一下
    2021-09-09
  • python?字典常用方法超詳細(xì)梳理總結(jié)

    python?字典常用方法超詳細(xì)梳理總結(jié)

    這篇文章主要介紹了Python數(shù)據(jù)類型字典dictionary,字典是另一種可變?nèi)萜髂P?,且可存儲任意類型對象。本篇文字將詳?xì)講述字典的常用方法,需要的可以參考一下
    2022-03-03

最新評論