<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
關於 sys.argv 可得好好說道說道了。當初我可是被折磨的不要不要的,上一章節我們提到 argv 是獲取程式外部的引數,返回值是一個列表。
說實話我一直在 python 直譯器、idea 執行,試圖從結果發現它的用途,然而結果一直都是沒結果,也在網上查了許多資料,大部分都是轉裁和複製的。給的都是簡明python教學上那個一長串程式碼的例子,說看了就明白了,可我看得暈頭轉向的還是沒真正明白,只知道 sys.argv[0]
表示當前指令碼本身檔案路徑的該指令碼檔案。後來經過大量努力,多方求教才真正明悟了,謹以記錄和分享,希望能從另一個角度給同在求索過程中的同學一點啟發。
sys.argv 其實就是一個從程式外部獲取引數
的橋樑,這裡所說的 外部
很關鍵,所以那些試圖從程式碼來說明它作用的解釋一直沒看明白。因為我們需要先在終端執行指令碼, 並從外部傳入引數(可以是多個),所以獲得的是一個列表(list),也就是說sys.argv其實可以看作是一個列表,所以才能用[ ]
提取其中的元素。其第一個元素是程式本身,隨後才依次是外部傳入的引數。
我們先來看一下 sys.argv 返回的是什麼?
import sys print(sys.argv) # >>> 執行結果如下: # >>> ['/Users/username/PycharmProjects/XXXXX/XXXXX/animal/package_sys.py'] # >>> 從執行結果可以看出 其輸出的就是當前路徑下的當前指令碼本身,也就可以理解為 'sys.argv' 其實就是執行自身的指令碼檔案 # >>> 我們從 '外部' 執行該指令碼檔案的時候,需要傳入引數(可以是多個)
接下來我們將上面的程式碼改為如下:
import sys print(sys.argv[0], sys.argv[1]) # >>> 接下來我們進入 Terminal 終端 利用 python 執行 該指令碼檔案,並傳入 測試引數,結果如下圖。
為了更好的 演示 sys.argv 屬性,我們將 sys 常用的函數與屬性進行一下條件判斷。範例如下:
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('該命令未識別')
然後在 Terminal 終端 執行該指令碼,如下圖:
看到這裡 ,應該明白了吧?sys.argv 其實就是一個列表,裡邊需要使用者傳入的引數,關鍵就是要明白這引數是從程式外部輸入的,而非程式碼本身的什麼地方,要想看到它的效果就應該將程式儲存了,從外部來執行程式並給出引數。
1、sys.argv 是獲取執行python檔案的時候命令列引數,且以list形式儲存引數
2、sys.argv[0]表示程式碼本身檔案路徑
下面我們通過一個極簡單的test.py程式的執行結果來說明它的用法
import sys a=sys.argv[0] print(a)
將test.py儲存在C槽的根目錄下。
在程式中找到 ‘執行’->點選->輸入"cmd"->確認鍵 進入控制檯命令視窗(如下圖),先輸入cd c: (作用是將命令路徑改到C槽根目錄),然後輸入test.py執行我們剛剛寫的程式:
這就是0指程式碼(即此.py程式)本身的意思。輸出的就是test.py。
如果輸入的是python c:test.py,輸出就是c:test.py
然後我們將程式碼中0改為1 :
a=sys.argv[1]
儲存後,再從控制檯視窗執行,這次我們加上一個引數,輸入:test.py what
得到的結果就是我們輸入的引數what
#輸入 $ 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)非正常退出
從上面輸出結果可以看出,
sys.argv[0]是當前所執行的指令碼,並且輸入什麼就是什麼,輸入test.py就是test.py,輸入./test.py就是./test.py
index 1以後的才是所傳入的引數。用sys.argv[1:]可以獲取到所有的引數,並且輸出到一個列表裡面。
如果 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)非正常退出
到此這篇關於一文搞懂關於 sys.argv 的詳解的文章就介紹到這了,更多相關sys.argv 是什麼內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45