Python 命令行傳參
說到 python 命令行傳參,可能大部分人的第一反應就是用 argparse。的確,argparse 在我們需要指定多個預設的參數(如深度學習中指定模型的超參數等)時,是非常有用的。但是如果有時我們只需要一個參數,那么再解析一整套 argparse 稍顯笨重。本文除了介紹 argparse 之外,也會介紹一些簡單輕便的命令行傳參方法。
sys
我們在學習 C/C++ 時知道主函數 main 需要傳入三個參數:
int main(int argc, char* argv[], char* env[]) {}
其中第三個參數是環境變量,大部分時候我們不寫在程序里,即一般有:
int main(int argc, char* argv[]) {}
關于這幾個參數包括環境變量參數更深入的解釋可參考:Linux中 C++ main函數參數argc和argv含義及用法、12 [虛擬化] 進程抽象;fork,execve,exit
簡單來說,這里的 argc 和 argv 分別是傳入參數的個數,和傳入的參數列表。這里傳入的參數,就是可以在命令行中傳遞的。
在 python 中,我們當然同樣可以用這種方式來傳遞命令行參數,這里我們需要借助內置的 sys 庫。
直接上代碼:
import sysprint(f'參數個數:{len(sys.argv)}')
print(f'參數列表:{str(sys.argv)}')
然后我們在命令行運行,并傳入幾個參數:
python test.py arg1 arg2
輸出為:
參數個數:3
參數列表:['test.py', 'arg1', 'arg2']
注意這里沒有所謂的 sys.argc,而是通過取參數列表的長度來獲得參數的個數 len(sys.argv)。
這種方式獲取幾個命令行參數有時是非常方便的。比如有時我們寫了一個腳本,要將目標檢測數據集中某一張圖像的檢測框畫出來查看,但是想要每次查看不同的圖像。就可以通過這種方式在運行腳本時通過命令行傳參。
# draw_box.py
import sysdef draw_box(image_name):# ...passif __name__ == "__main__":draw_box(sys.argv[1])
這樣在運行時直接在命令行中:
python draw_box.py 12345.jpg
getopt 模塊
getopt模塊是專門處理命令行參數的模塊,用于獲取命令行選項和參數,也就是sys.argv。命令行選項使得程序的參數更加靈活。支持短選項模式 - 和長選項模式 –。
該模塊提供了兩個方法及一個異常處理來解析命令行參數。
getopt.getopt 方法
getopt.getopt 方法用于解析命令行參數列表,語法格式如下:
getopt.getopt(args, options[, long_options])
方法參數說明:
- args: 要解析的命令行參數列表。
- options : 以字符串的格式定義,options 后的冒號 : 表示如果設置該選項,必須有附加的參數,否則就不附加參數。
- long_options : 以列表的格式定義,long_options 后的等號 = 表示該選項必須有附加的參數,不帶等號表示該選項不附加參數。
- 該方法返回值由兩個元素組成: 第一個是 (option, value) 元組的列表。 第二個是參數列表,包含那些沒有 - 或 – 的參數。
另外一個方法是 getopt.gnu_getopt,這里不多做介紹。
Exception getopt.GetoptError
在沒有找到參數列表,或選項的需要的參數為空時會觸發該異常。
異常的參數是一個字符串,表示錯誤的原因。屬性 msg 和 opt 為相關選項的錯誤信息。
argparse
最后是大家最熟悉的 argparse,由于它功能強大且復雜,這里就介紹幾個最常用的方式。
# test_argparse.py
import argparseparser.add_argument('--representation_size', type=int, default=768)
parser.add_argument('--batchSize', type=int, default=32, help='batch size')
parser.add_argument('--epochs', type=int, default=100, help='epochs')
parser.add_argument('--num_workers', type=int, default=20, help='num workers')
parser.add_argument('--tbx', default='debug', help='the name of dir to store data for tensorboard')
parser.add_argument('--gpu_id', default='0', help='gpu id')
parser.add_argument('--load_path', type=str, default='')
parser.add_argument('--lr', type=float, default=5e-3, help='learning rate')
parser.add_argument('--lr_decay', type=float, default=1., help='gamma of learning rate decay')
parser.add_argument('--p', type=float, default=0.75, help='p of drop out')parser.add_argument('--freeze-features', action="store_true")args = parser.parse_args()
print(args.accumulate(args.integers))
在導入 argparse 之后分以下幾步:
- 先建立一個
parser
對象 - 然后通過
add_argument
加入所需要的參數 - 最后通過調用
parser
對象的parse_args
方法來將參數解析,并賦值給args
之后就可使用添加的參數(如 args.integer
)了。
在命令行傳參時需:
python test_argparse.py --batchSize 64 --num_workers 12 --freeze-features
若未傳參,則按照設置的 default
賦值。
Ref:
https://www.runoob.com/python/python-command-line-arguments.html
https://docs.python.org/zh-cn/3/library/argparse.html