最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Python如何優(yōu)雅地解析命令行

 更新時間:2022年06月14日 14:18:49   作者:編程學(xué)習(xí)網(wǎng)  
隨著我們編程經(jīng)驗的增長,對命令行的熟悉程度日漸加深,想來很多人會漸漸地體會到使用命令行帶來的高效率。本文將介紹Python解析命令行的兩種方法,需要的可以參考一下

如何優(yōu)雅地解析命令行選項

隨著我們編程經(jīng)驗的增長,對命令行的熟悉程度日漸加深,想來很多人會漸漸地體會到使用命令行帶來的高效率。

自然而然地,我們自己寫的很多程序(或者干脆就是腳本),也希望能夠像原生命令和其他程序一樣,通過運行時輸入的參數(shù)就可以設(shè)定、改變程序的行為;而不必一層層找到相應(yīng)的配置文件,然后還要定位到相應(yīng)內(nèi)容、修改、保存、退出……

想想就很麻煩好嗎

1. 手動解析

所以讓我們開始解析命令行參數(shù)吧~

在以前關(guān)于模塊的文章中我們提到過sys.args這個變量,其中保存的就是調(diào)用當(dāng)前腳本時傳入的命令行參數(shù)。

我們先觀察一下這個變量:

# test_sys.py
import sys

print(sys.argv)

通過命令行調(diào)用:

$ python test_sys.py -d today -t now --author justdopython --country China --auto

得到如下輸出結(jié)果:

['test_sys.py', '-d', 'today', '-t', 'now', '--author', 'justdopython', '--country', 'China', '--auto']

可見,sys.argv其實就是將命令行參數(shù)按空格切分,得到的一個字符串列表。此外,命令行參數(shù)的第一個就是當(dāng)前運行的腳本名稱。

我們?nèi)绻胍崛〕龈鱾€參數(shù)及其對應(yīng)的值,首先得區(qū)分出命令行的長參數(shù)和短參數(shù),它們分別由“--”和“-”開頭作為標(biāo)識。所以我們也以此作為判斷長短參數(shù)的條件:

import sys


for command_arg in sys.argv[1:]:
    if command_arg.startswith('--'):
        print("%s 為長參數(shù)" % command_arg)
    elif command_arg.startswith('-'):
        print("%s 為短參數(shù)" % command_arg)

測試結(jié)果:

$ python manually_parse_argv.py -d today -t now --author justdopython --country China --auto

-d 為短參數(shù)
-t 為短參數(shù)
--author 為長參數(shù)
--country 為長參數(shù)
--auto 為長參數(shù)

緊接著,我們需要在解析出長短參數(shù)這一步的基礎(chǔ)上,再解析出對應(yīng)的參數(shù)值:

# manually_parse_argv.py
import sys


# 由于sys.argv的第一個變量是當(dāng)前腳本名稱,因此略過
for index, command_arg in enumerate(sys.argv[1:]):
    if command_arg.startswith('--'):
        try:
            value = sys.argv[1:][index+1]
            if not value.startswith('-'):
                print("%s 為長參數(shù),參數(shù)值為 %s" % (command_arg, value))
                continue
        except IndexError:
            pass
        
        print("%s 為長參數(shù),無參數(shù)值" % command_arg)

    elif command_arg.startswith('-'):
        try:
            value = sys.argv[1:][index+1]
            if not value.startswith('-'):
                print("%s 為短參數(shù),參數(shù)值為 %s" % (command_arg, value))
                continue
        except IndexError:
            pass
        
        print("%s 為短參數(shù),無參數(shù)值" % command_arg)

再測試一下:

$ python manually_parse_argv.py -d today -t now --author justdopython --country China --auto

-d 為短參數(shù),參數(shù)值為 today
-t 為短參數(shù),參數(shù)值為 now
--author 為長參數(shù),參數(shù)值為 justdopython
--country 為長參數(shù),參數(shù)值為 China
--auto 為長參數(shù),無參數(shù)值

看起來還不錯。

但是再看看我們的代碼……真正的邏輯還沒開始,反倒是為了解析命令行參數(shù)已經(jīng)寫了幾十行代碼。這一點都不pythonic——這還不包括一些其他關(guān)于異常情況的處理。

更何況是要在每個類似的程序中加入這么一段程序了。

2. getopt模塊

Python的好處就在于,生態(tài)過于豐富,幾乎你要用到的每個功能,都已經(jīng)有人為你寫好了現(xiàn)成的模塊以供調(diào)用。

衣來伸手飯來張口的日子除了能在夢中想想,在用Python寫程序的時候也不是不可以奢望。

比如命令行參數(shù)解析,就有一個名為getopt的模塊,既能夠準(zhǔn)確區(qū)分長短命令行參數(shù),也能夠恰當(dāng)?shù)靥崛∶钚袇?shù)的值。

咱們先來看看:

# test_getopt.py
import sys
import getopt


opts, args = getopt.getopt(sys.argv[1:], 'd:t:', ["author=", "country=", "auto"])

print(opts)
print(args)

打印結(jié)果:

$ python test_getopt.py -d today -t now --author justdopython --country China --auto
[('-d', 'today'), ('-t', 'now'), ('--author', 'justdopython'), ('--country', 'China'), ('--auto', '')]
[]

下面我們來分別解釋一下相關(guān)參數(shù)的含義。

getopt模塊中的getopt函數(shù)用于解析命令行參數(shù)。

該函數(shù)接受三個參數(shù):args,shortopts和longopts,分別代表“命令行參數(shù)”,“要接收的短選項”和“要接收的長選項”。

其中args和longopts均為字符串組成的列表,而shortopts則為一個字符串。

同樣地,由于sys.argv的第一個值為當(dāng)前腳本名稱,所以多數(shù)情況下我們會選擇向args參數(shù)傳入sys.argv[1:]的值。

而shortopts這個參數(shù)接受的字符串則表示需要解析哪些短選項,字符串中每個字母均表示一個短選項:

import sys
import getopt


opts, args = getopt.getopt(sys.argv[1:], 'dt')

print(opts)
print(args)

輸出結(jié)果:

$ python test_getopt.py -d  -t
[('-d', ''), ('-t', '')]
[]

當(dāng)然,如果輸入的參數(shù)少于預(yù)期,也不會導(dǎo)致解析失?。?/p>

$ python test_getopt.py  -t
[('-t', '')]
[]

但要是給出了預(yù)期之外的參數(shù),就會導(dǎo)致模塊拋錯:

$ python test_getopt.py -d  -t -k
Traceback (most recent call last):
  File "test_getopt.py", line 11, in <module>
    opts, args = getopt.getopt(sys.argv[1:], 'dt')
      ...
    raise GetoptError(_('option -%s not recognized') % opt, opt)
getopt.GetoptError: option -k not recognized

這樣的處理邏輯也符合我們使用命令的體驗,可以簡單地理解為“寧缺毋濫”。

如果短參數(shù)相應(yīng)的字母后帶了一個冒號:,則意味著這個參數(shù)需要指定一個參數(shù)值。getopt會將該參數(shù)對應(yīng)的下一個命令行參數(shù)作為參數(shù)值(而不論下一個參數(shù)是什么形式):

import sys
import getopt


opts, args = getopt.getopt(sys.argv[1:], 'd:t')

print(opts)
print(args)

# $ python test_getopt.py -d  -t
# [('-d', '-t')]
# []

此外,一旦getopt在預(yù)期接收到長短選項的位置沒有找到以“--”或“-”開頭的字符串,就會終止解析過程,剩下的未解析字符串均放在返回元組的第二項中返回。

$ python test_getopt.py -d d_value o --pattern -t
[('-d', 'd_value')]
['o', '--pattern', '-t']

類似地,longopts參數(shù)表示需要解析的長參數(shù)。

列表中的每一個字符串代表一個長參數(shù):

import sys
import getopt


opts, args = getopt.getopt(sys.argv[1:], '', ["author", "country"])

print(opts)
print(args)

# $ python test_getopt.py --author  --country
# [('--author', ''), ('--country', '')]
# []

要解析帶有參數(shù)值的長參數(shù),還應(yīng)在每個長參數(shù)后附帶一個等于號(=),以標(biāo)識該參數(shù)需要帶值:

import sys
import getopt


opts, args = getopt.getopt(sys.argv[1:], '', ["author=", "country"])

print(opts)
print(args)

# $ python test_getopt.py --author justdopython --country
# [('--author', 'justdopython'), ('--country', '')]
# []

所以最終就得到了我們一開始的解析結(jié)果:

import sys
import getopt


opts, args = getopt.getopt(sys.argv[1:], 'd:t:', ["author=", "country=", "auto"])

print(opts)
print(args)

# $ python test_getopt.py -d today -t now --author justdopython --country China --auto
# [('-d', 'today'), ('-t', 'now'), ('--author', 'justdopython'), ('--country', 'China'), ('--auto', '')]
# []

解析完成后,我們再從opts中提取相應(yīng)的值即可。

懶人福音

getopt除了替我們節(jié)省了編寫命令行參數(shù)解析代碼的時間和精力,另一方面還可以讓你在輸入命令行參數(shù)時少打幾個字母——當(dāng)然,嚴(yán)謹(jǐn)來講,我們并不建議此類行為。慎用,慎用!

getopt對長參數(shù)的解析支持前綴匹配,只要輸入的參數(shù)能夠與某個指定參數(shù)唯一匹配,同樣能夠完成預(yù)期解析。

$ python test_getopt.py -d today -t now --auth justdopython --coun China --auto
[('-d', 'today'), ('-t', 'now'), ('--author', 'justdopython'), ('--country', 'China'), ('--auto', '')]
[]

可以看到,author和country兩個參數(shù)我們都只輸入了一部分,但是getopt依然進(jìn)行了正確的解析。

總結(jié)

本文講解了使用Python解析命令行參數(shù)的兩種方式,一種是略顯笨重的手動解析,即自己編寫程序自定義解析;另一種則是調(diào)用現(xiàn)成、且更加健壯的getopt模塊來完成解析。

從此以后,我們終于可以擺脫繁瑣的配置文件,用一種優(yōu)雅簡潔的方式來修改程序的行為了。

以上就是詳解Python如何優(yōu)雅地解析命令行的詳細(xì)內(nèi)容,更多關(guān)于Python解析命令行的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Django--權(quán)限Permissions的例子

    Django--權(quán)限Permissions的例子

    今天小編就為大家分享一篇Django--權(quán)限Permissions的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 你真的了解Python的random模塊嗎?

    你真的了解Python的random模塊嗎?

    這篇文章主要介紹了Python的random模塊的相關(guān)內(nèi)容,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • django 2.0更新的10條注意事項總結(jié)

    django 2.0更新的10條注意事項總結(jié)

    Django 是 Python Web 開發(fā)最常用的框架之一,跟進(jìn)它的最新變化絕對是必須的。下面這篇文章主要給大家介紹了關(guān)于django 2.0更新的10條注意事項,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-01-01
  • python腳本打包后無法運行exe文件的解決方案

    python腳本打包后無法運行exe文件的解決方案

    這篇文章主要介紹了python腳本打包后無法運行exe文件的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • python中的subprocess.Popen()使用詳解

    python中的subprocess.Popen()使用詳解

    今天小編就為大家分享一篇python中的subprocess.Popen()使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python實現(xiàn)數(shù)據(jù)寫入excel表格

    python實現(xiàn)數(shù)據(jù)寫入excel表格

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)數(shù)據(jù)寫入excel表格,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 基于numpy中數(shù)組元素的切片復(fù)制方法

    基于numpy中數(shù)組元素的切片復(fù)制方法

    今天小編就為大家分享一篇基于numpy中數(shù)組元素的切片復(fù)制方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • python 爬蟲百度地圖的信息界面的實現(xiàn)方法

    python 爬蟲百度地圖的信息界面的實現(xiàn)方法

    這篇文章主要介紹了python 爬蟲百度地圖的界面的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • python?實現(xiàn)銀行卡號查詢銀行名稱和簡稱功能

    python?實現(xiàn)銀行卡號查詢銀行名稱和簡稱功能

    這篇文章主要介紹了python?實現(xiàn)銀行卡號查詢銀行名稱和簡稱功能,本文通過實例代碼補充介紹了基于PyQT5+OpenCv實現(xiàn)銀行卡號識別功能,感興趣的朋友一起看看吧
    2023-11-11
  • Python進(jìn)制轉(zhuǎn)換用法詳解

    Python進(jìn)制轉(zhuǎn)換用法詳解

    大家好,本篇文章主要講的是Python進(jìn)制轉(zhuǎn)換用法詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01

最新評論

哈密市| 松原市| 烟台市| 潍坊市| 临西县| 扎囊县| 英德市| 武清区| 新巴尔虎左旗| 台中市| 天门市| 金寨县| 沁阳市| 互助| 饶阳县| 常熟市| 安泽县| 海淀区| 鄱阳县| 南皮县| 邯郸县| 萨嘎县| 县级市| 衡东县| 利津县| 达日县| 石台县| 山西省| 溆浦县| 和平区| 沈丘县| 新野县| 平凉市| 满洲里市| 黄龙县| 肥西县| 龙川县| 烟台市| 陆川县| 旬邑县| 大埔区|