在命令列中執行python程式碼是很常見的,下面介紹如何定義命令後面跟的引數。
常規用法
Python程式碼中主要使用下面幾行程式碼來定義並獲取需要在命令列中賦值的引數:
import argparse parser = argparse.ArgumentParser("Description.") # ————1———— parser.add_argument('--test1', type=str, default="1", help="Test1 help.") # ————2———— parser.add_argument('--test2', type=float, default=2.1, help="Test2 help.") # ————2———— args = parser.parse_args() # ————3———— print(args) test1, test2 = args.test1, args.test2 # ————4———— print(type(test1), test1, test1 + " add test") print(type(test2), test2, test2 + 100)
註釋:
1、獲取外部引數物件例項。可以傳入字串來描述總體的外部引數。
2、定義外部引數,可以多次呼叫來定義多個外部引數。函式的第一個引數是外部引數的名稱,建議以兩個減號開頭,中間不要使用數字字母下劃線以外的符號,否則容易出錯。type是你希望外部引數傳入後轉換的型別,比如--test1定義為str,即使命令列傳參不新增引號,函式也將它轉換為字串(當然不加引號傳字串就不能用空格了)。而--test2是float,即使命令列傳參帶了引號,只要能轉換為數字,函式都能轉換為float型別。default是外部引數的預設值。如果命令列不對外部引數賦值而使用預設值,函式不會對你定義的預設值進行type上的轉換,所以default最好直接定義為type指定的型別(比如--test1的default定義為"1"而不是1)。help傳入對當前外部引數的描述,命令列中使用--help輸出的就是這個。
3、分析獲取的外部引數。傳出的是一個名稱空間,類似於字典,但使用屬性的方式而不是key索引來獲取命名對應的外部引數值。
4、以獲取屬性的方式獲取外部引數。
需要注意的是,外部引數的定義必須寫在獲取外部引數之前。也就是說,parser.add_argument()要寫在parser.parse_args()之前,否則外部引數無法被命令列捕獲。另外,如果程式碼中沒有parser.parse_args(),命令列就不能傳參。
用命令列執行以上程式碼,命令與輸出如下(以上程式碼儲存為test.py):
可以看出,故意以數字和字串的方式分別對字串和float型別的外部引數賦值,函式都能正確地轉換並正確地參與運算。
使用預設值時輸出如下:
注意事項
通過以上的實驗,argparse庫似乎能將外部引數正確轉換為各種型別,只要能轉換。下面來實驗是否能傳入一個numpy陣列。程式碼如下:
import numpy as np import argparse parser = argparse.ArgumentParser() parser.add_argument('--array', type=np.array, default=np.array([1,2])) args = parser.parse_args() print(args) array = args.array print(type(array)) print(array) print(array + 1)
當使用預設值時:
執行正確,但當我們意圖傳入外部引數時:
儘管傳入的[1,2]被轉換為numpy.ndarray型別,它卻並不能參與運算。所以,並不是所有的型別都能在命令列中傳入的。