一文搞懂關(guān)于?sys.argv?的詳解
詳解 sys.argv
關(guān)于 sys.argv 可得好好說(shuō)道說(shuō)道了。當(dāng)初我可是被折磨的不要不要的,上一章節(jié)我們提到 argv 是獲取程序外部的參數(shù),返回值是一個(gè)列表。
說(shuō)實(shí)話我一直在 python 解釋器、idea 運(yùn)行,試圖從結(jié)果發(fā)現(xiàn)它的用途,然而結(jié)果一直都是沒(méi)結(jié)果,也在網(wǎng)上查了許多資料,大部分都是轉(zhuǎn)裁和復(fù)制的。給的都是簡(jiǎn)明python教程上那個(gè)一長(zhǎng)串代碼的例子,說(shuō)看了就明白了,可我看得暈頭轉(zhuǎn)向的還是沒(méi)真正明白,只知道 sys.argv[0]
表示當(dāng)前腳本本身文件路徑的該腳本文件。后來(lái)經(jīng)過(guò)大量努力,多方求教才真正明悟了,謹(jǐn)以記錄和分享,希望能從另一個(gè)角度給同在求索過(guò)程中的同學(xué)一點(diǎn)啟發(fā)。
sys.argv 其實(shí)就是一個(gè)從程序外部獲取參數(shù)
的橋梁,這里所說(shuō)的 外部
很關(guān)鍵,所以那些試圖從代碼來(lái)說(shuō)明它作用的解釋一直沒(méi)看明白。因?yàn)槲覀冃枰仍诮K端執(zhí)行腳本, 并從外部傳入?yún)?shù)(可以是多個(gè)),所以獲得的是一個(gè)列表(list),也就是說(shuō)sys.argv其實(shí)可以看作是一個(gè)列表,所以才能用[ ]
提取其中的元素。其第一個(gè)元素是程序本身,隨后才依次是外部傳入的參數(shù)。
我們先來(lái)看一下 sys.argv 返回的是什么?
import sys print(sys.argv) # >>> 執(zhí)行結(jié)果如下: # >>> ['/Users/username/PycharmProjects/XXXXX/XXXXX/animal/package_sys.py'] # >>> 從執(zhí)行結(jié)果可以看出 其輸出的就是當(dāng)前路徑下的當(dāng)前腳本本身,也就可以理解為 'sys.argv' 其實(shí)就是運(yùn)行自身的腳本文件 # >>> 我們從 '外部' 運(yùn)行該腳本文件的時(shí)候,需要傳入?yún)?shù)(可以是多個(gè))
接下來(lái)我們將上面的代碼改為如下:
import sys print(sys.argv[0], sys.argv[1]) # >>> 接下來(lái)我們進(jìn)入 Terminal 終端 利用 python 執(zhí)行 該腳本文件,并傳入 測(cè)試參數(shù),結(jié)果如下圖。
為了更好的 演示 sys.argv 屬性,我們將 sys 常用的函數(shù)與屬性進(jìn)行一下條件判斷。示例如下:
import sys command = sys.argv[1] if command == 'modules': modules = sys.modules print(modules) elif command == 'path': path = sys.path print(path) elif command == 'encoding': code = sys.getdefaultencoding() print(code) elif command == 'platform': print(sys.platform) elif command == 'version': print(sys.version) else: print('該命令未識(shí)別')
然后在 Terminal 終端 執(zhí)行該腳本,如下圖:
看到這里 ,應(yīng)該明白了吧?sys.argv 其實(shí)就是一個(gè)列表,里邊需要用戶傳入的參數(shù),關(guān)鍵就是要明白這參數(shù)是從程序外部輸入的,而非代碼本身的什么地方,要想看到它的效果就應(yīng)該將程序保存了,從外部來(lái)運(yùn)行程序并給出參數(shù)。
ps:sys.argv[]的用法
一、介紹
1、sys.argv 是獲取運(yùn)行python文件的時(shí)候命令行參數(shù),且以list形式存儲(chǔ)參數(shù)
2、sys.argv[0]表示代碼本身文件路徑
下面我們通過(guò)一個(gè)極簡(jiǎn)單的test.py程序的運(yùn)行結(jié)果來(lái)說(shuō)明它的用法
import sys a=sys.argv[0] print(a)
將test.py保存在c盤的根目錄下。
在程序中找到 ‘運(yùn)行’->點(diǎn)擊->輸入"cmd"->回車鍵 進(jìn)入控制臺(tái)命令窗口(如下圖),先輸入cd c:\ (作用是將命令路徑改到c盤根目錄),然后輸入test.py運(yùn)行我們剛剛寫的程序:
這就是0指代碼(即此.py程序)本身的意思。輸出的就是test.py。
如果輸入的是python c:\test.py,輸出就是c:\test.py
然后我們將代碼中0改為1 :
a=sys.argv[1]
保存后,再?gòu)目刂婆_(tái)窗口運(yùn)行,這次我們加上一個(gè)參數(shù),輸入:test.py what
得到的結(jié)果就是我們輸入的參數(shù)what
二、簡(jiǎn)單的例子
#輸入 $ python ./test.py aa bb cc import sys def main(argv): print(argv[0]) aa print(argv[1]) bb print(argv[1:]) ['bb', 'cc'] print(argv[1][1:]) b print('sys.argv[0]:',sys.argv[0]) #test1.py print('sys.argv[1]:',sys.argv[1]) #aa print('sys.argv[1:]:',sys.argv[1:]) #['aa', 'bb', 'cc'] print('sys.argv:',sys.argv) #['test1.py', 'aa', 'bb', 'cc'] print('type(sys.argv):',type(sys.argv)) #<class 'list'> print('len(sys.argv):',len(sys.argv)) #4 return 0 if __name__ == '__main__': sys.exit(main(sys.argv[1:])) #sys.exit(0)正常退出, sys.exit(1)非正常退出
從上面輸出結(jié)果可以看出,
sys.argv[0]是當(dāng)前所執(zhí)行的腳本,并且輸入什么就是什么,輸入test.py就是test.py,輸入./test.py就是./test.py
index 1以后的才是所傳入的參數(shù)。用sys.argv[1:]可以獲取到所有的參數(shù),并且輸出到一個(gè)列表里面。
三、輸入為 --numa=1 --numb=2 形式和 --numa 1 --numb 2 形式
如果 python test.py --numa=1 --numb=2
則sys.argv[1:] 為 [test.py, --numa=1, --numb=2]
如果 python test.py --numa 1 --numb 2
則sys.argv[1:] 為 [test.py, --numa, 1, --numb, 2]
#輸入 $ python test.py --numa=1 --numb=2 import sys def main(argv): print(argv[0]) --numa=1 print(argv[1]) --numb=2 print(argv[1:]) ['--numb=2'] print(argv[1][1:]) -numb=2 print('sys.argv[0]:',sys.argv[0]) #test1.py print('sys.argv[1]:',sys.argv[1]) #--numa=1 print('sys.argv[1:]:',sys.argv[1:]) #['--numa=1', '--numb=2'] print('sys.argv:',sys.argv) #['test1.py', '--numa=1', '--numb=2'] print('type(sys.argv):',type(sys.argv)) #<class 'list'> print('len(sys.argv):',len(sys.argv)) #3 return 0 if __name__ == '__main__': sys.exit(main(sys.argv[1:])) #sys.exit(0)正常退出, sys.exit(1)非正常退出 ============================================================================== #輸入 $ python test.py --numa 1 --numb 2 import sys def main(argv): print(argv[0]) --numa print(argv[1]) 1 print(argv[1:]) ['1', '--numb', '2'] print(argv[1][1:]) print('sys.argv[0]:',sys.argv[0]) #test1.py print('sys.argv[1]:',sys.argv[1]) #--numa print('sys.argv[1:]:',sys.argv[1:]) #['--numa', '1', '--numb', '2'] print('sys.argv:',sys.argv) #['test1.py', '--numa', '1', '--numb', '2'] print('type(sys.argv):',type(sys.argv)) #<class 'list'> print('len(sys.argv):',len(sys.argv)) #5 return 0 if __name__ == '__main__': sys.exit(main(sys.argv[1:])) #sys.exit(0)正常退出, sys.exit(1)非正常退出
到此這篇關(guān)于一文搞懂關(guān)于 sys.argv 的詳解的文章就介紹到這了,更多相關(guān)sys.argv 是什么內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用python爬取B站千萬(wàn)級(jí)數(shù)據(jù)
B站我想大家都熟悉吧,其實(shí) B 站的爬蟲網(wǎng)上一搜一大堆。不過(guò)紙上得來(lái)終覺(jué)淺,絕知此事要躬行,我碼故我在。2018-06-06python繪制發(fā)散型柱狀圖+誤差陰影時(shí)間序列圖+雙坐標(biāo)系時(shí)間序列圖+繪制金字塔圖
這篇文章主要介紹了python繪制發(fā)散型柱狀圖+誤差陰影時(shí)間序列圖+雙坐標(biāo)系時(shí)間序列圖+繪制金字塔圖,詳細(xì)的內(nèi)容需要的小伙伴可以參考一下下面文章內(nèi)容2022-08-08pytorch 轉(zhuǎn)換矩陣的維數(shù)位置方法
今天小編就為大家分享一篇pytorch 轉(zhuǎn)換矩陣的維數(shù)位置方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Python使用tarfile模塊實(shí)現(xiàn)免費(fèi)壓縮解壓
Python自帶的tarfile模塊可以方便讀取tar歸檔文件,厲害的是可以處理使用gzip和bz2壓縮歸檔文件tar.gz和tar.bz2,這篇文章主要介紹了Python使用tarfile模塊實(shí)現(xiàn)免費(fèi)壓縮解壓,需要的朋友可以參考下2024-03-03win8.1安裝Python 2.7版環(huán)境圖文詳解
在本篇內(nèi)容里小編給大家分享了關(guān)于win8.1安裝Python 2.7版環(huán)境的詳細(xì)步驟和方法,有興趣的朋友們跟著學(xué)習(xí)下。2019-07-07Python通過(guò)len函數(shù)返回對(duì)象長(zhǎng)度
這篇文章主要介紹了Python通過(guò)len函數(shù)返回對(duì)象長(zhǎng)度,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Python表格處理模塊xlrd在Anaconda中的安裝方法
本文介紹在Anaconda環(huán)境下,安裝Python讀取.xls格式表格文件的庫(kù)xlrd的方法,xlrd是一個(gè)用于讀取Excel文件的Python庫(kù),本文介紹了xlrd庫(kù)的一些主要特點(diǎn)和功能,感興趣的朋友一起看看吧2024-04-04selenium XPath定位的實(shí)現(xiàn)示例
XPath是一種在XML文檔中定位和選擇節(jié)點(diǎn)的語(yǔ)言,通過(guò)路徑表達(dá)式遍歷XML樹,支持節(jié)點(diǎn)選取、字符串匹配、數(shù)值計(jì)算、邏輯運(yùn)算等功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10