首頁 > 軟體

一文搞懂關於 sys.argv 的詳解

2023-01-16 14:01:14

詳解 sys.argv

關於 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 其實就是一個列表,裡邊需要使用者傳入的引數,關鍵就是要明白這引數是從程式外部輸入的,而非程式碼本身的什麼地方,要想看到它的效果就應該將程式儲存了,從外部來執行程式並給出引數。

ps: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:]可以獲取到所有的引數,並且輸出到一個列表裡面。

三、輸入為 --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)非正常退出

到此這篇關於一文搞懂關於 sys.argv 的詳解的文章就介紹到這了,更多相關sys.argv 是什麼內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com