import argparse def main(): #設置一些參數 parser = argparse.ArgumentParser() parser.add_argument('--device', default='0,1,2,3', type=str, required=False, help='設置使用哪些顯卡') parser.add_argument('--model_config', default='config/model_config_small.json', type=str, required=False, help='選擇模型參數') parser.add_argument('--tokenizer_path', default='cache/vocab_small.txt', type=str, required=False, help='選擇詞庫') parser.add_argument('--raw_data_path', default='data/train.json', type=str, required=False, help='原始訓練語料') parser.add_argument('--tokenized_data_path', default='data/tokenized/', type=str, required=False, help='tokenized語料存放位置') parser.add_argument('--raw', action='store_true', help='是否先做tokenize') parser.add_argument('--epochs', default=5, type=int, required=False, help='訓練循環') parser.add_argument('--batch_size', default=8, type=int, required=False, help='訓練batch size') parser.add_argument('--lr', default=1.5e-4, type=float, required=False, help='學習率') parser.add_argument('--warmup_steps', default=2000, type=int, required=False, help='warm up步數') parser.add_argument('--log_step', default=1, type=int, required=False, help='多少步匯報一次loss,設置為gradient accumulation的整數倍') parser.add_argument('--stride', default=768, type=int, required=False, help='訓練時取訓練數據的窗口步長') parser.add_argument('--gradient_accumulation', default=1, type=int, required=False, help='梯度積累') parser.add_argument('--fp16', action='store_true', help='混合精度') parser.add_argument('--fp16_opt_level', default='O1', type=str, required=False) parser.add_argument('--max_grad_norm', default=1.0, type=float, required=False) parser.add_argument('--num_pieces', default=100, type=int, required=False, help='將訓練語料分成多少份') parser.add_argument('--min_length', default=128, type=int, required=False, help='最短收錄文章長度') parser.add_argument('--output_dir', default='model/', type=str, required=False, help='模型輸出路徑') parser.add_argument('--pretrained_model', default='', type=str, required=False, help='模型訓練起點路徑') parser.add_argument('--writer_dir', default='tensorboard_summary/', type=str, required=False, help='Tensorboard路徑') parser.add_argument('--segment', action='store_true', help='中文以詞為單位') parser.add_argument('--bpe_token', action='store_true', help='subword') parser.add_argument('--encoder_json', default="tokenizations/encoder.json", type=str, help="encoder.json") parser.add_argument('--vocab_bpe', default="tokenizations/vocab.bpe", type=str, help="vocab.bpe") args = parser.parse_args() print('args:\n' + args.__repr__()) #設置完后接下來可以使用這些參數 if args.segment: from tokenizations import tokenization_bert_word_level as tokenization_bert else: from tokenizations import tokenization_bert os.environ["CUDA_VISIBLE_DEVICES"] = args.device # 此處設置程序使用哪些顯卡
required - 必需參數,通常-f這樣的選項是可選的,但是如果required=True那么就是必須的了
1 sys.argv
如果腳本很簡單或臨時使用,沒有多個復雜的參數選項,可以直接利用sys.argv
將腳本后的參數依次讀取(讀進來的默認是字符串格式)。
import sys print("輸入的參數為:%s" % sys.argv[1])
命令行執行效果:
>python demo.py 1 輸入的參數為:1
使用介紹:
argparse.ArgumentParser()方法參數須知:一般我們只選擇用description prog=None - 程序名 description=None, - help時顯示的開始文字 epilog=None, - help時顯示的結尾文字 parents=[], -若與其他參數的一些內容一樣,可以繼承 formatter_class=argparse.HelpFormatter, - 自定義幫助信息的格式 prefix_chars='-', - 命令的前綴,默認是‘-’ fromfile_prefix_chars=None, - 命令行參數從文件中讀取 argument_default=None, - 設置一個全局的選項缺省值,一般每個選項單獨設置 conflict_handler='error', - 定義兩個add_argument中添加的選項名字發生沖突時怎么處理,默認處理是拋出異常 add_help=True - 是否增加-h/--help選項,默認是True)
簡單用法:
- 創建 ArgumentParser() 對象
- 調用 add_argument() 方法添加參數
- 使用 parse_args() 解析添加的參數
import argparse parser = argparse.ArgumentParser() parser.add_argument("square", help="請輸入一個數字", type=int) parser.add_argument("input_str", help="請輸入一個字母", type=str) args = parser.parse_args() print(args.square ** 2) print(args.input_str)
把上面的代碼保存到test_argparse.py文件,
1)命令行運行時,不添加參數:在終端運行python3 test_argparse.py ,運行結果如下:
$python3 test_argparse.py usage: test_argparse.py [-h] square input_str test_argparse.py: error: the following arguments are required: square, input_str
2)命令行運行時加上-h ,查看幫助:執行python3 test_argparse.py -h,運行結果如下:
$ python3 test_argparse.py -h usage: test_argparse.py [-h] square input_str positional arguments: square 請輸入一個數字 input_str 請輸入一個字母 optional arguments: -h, --help show this help message and exit
3) 命令行運行加上參數,按照提示加上一個數字,一個字母:執行python3 test_argparse.py 10 'hello world!' , 運行結果如下
$python3 test_argparse.py 10 'hello world!' 100 hello world!
4)如果輸入的格式不正確,會提示類型不對,例如第1個參數輸入一個字符串,運行結果如下:
$ python3 test_argparse.py 'abcd' 11 usage: test_argparse.py [-h] square input_str test_argparse.py: error: argument square: invalid int value: 'abcd'
現在看下可選參數的用法,所謂可選參數,也就是命令行參數是可選的,廢話少說,看下面例子:
parser.add_argument("--square", help="display a square of a given number", type=int) parser.add_argument("--cubic", help="display a cubic of a given number", type=int)
之前已經提到了用type參數就可以指定輸入的參數類型。而這個type類型還可以表示文件操作的類型從而直接進行文件的讀寫操作。
parser.add_argument('file', type=argparser.FileType('r')) # 讀取文件
args = parser.parse_args() for line in args.file: print line.strip()
可以設置默認值
一般情況下會設置一些默認參數從而不需要每次輸入某些不需要變動的參數,利用default參數即可實現。
parser.add_argument('filename', default='text.txt')
2 argparse
如果參數很多,比較復雜,並且類型不統一,那么argparse
可以很好的解決這些問題,下面一個實例解釋了argparse
的基本使用方法
import argparse # description參數可以用於描述腳本的參數作用,默認為空 parser=argparse.ArgumentParser(description="A description of what the program does") parser.add_argument('--toy','-t',action='store_true',help='Use only 50K samples of data') parser.add_argument('--num_epochs',choices=[5,10,20],default=5,type=int,help='Number of epochs.') parser.add_argument("--num_layers", type=int, required=True, help="Network depth.") args=parser.parse_args() print(args) print(args.toy,args.num_epochs,args.num_layers)
命令行執行效果:
>python demo.py --num_epochs 10 --num_layers 10 Namespace(num_epochs=10, num_layers=10, toy=False) False 10 10
parser.add_argument('--toy','-t',action='store_true',help='Use only 50K samples of data')
--toy
:為參數名稱
-t
:為參數別稱
action='store_true'
:參數是否使用,如果使用則為True,否則為False
>python demo.py -t --num_epochs 10 --num_layers 10 Namespace(num_epochs=10, num_layers=10, toy=True) True 10 10 # 對比和上次執行的區別
help
:參數說明
parser.add_argument('--num_epochs',choices=[5,10,20],default=5,type=int,help='Number of epochs.')
choices
:候選值,輸出參數必須在候選值里面,否如會出現下面的結果:
>python demo.py -t --num_epochs 30 --num_layers 10 usage: demo.py [-h] [--toy] [--num_epochs {5,10,20}] --num_layers NUM_LAYERS demo.py: error: argument --num_epochs: invalid choice: 30 (choose from 5, 10, 20)
default
:默認值,如果不輸入參數,則使用該默認值
>python demo.py -t --num_layers 10 Namespace(num_epochs=5, num_layers=10, toy=True) True 5 10
int
:參數類型
- 實例2
parser.add_argument("--num_layers", type=int, required=True, help="Network depth.")
required
:為必選參數,如果不輸入,則出現以下錯誤:
>python demo.py -t --num_epochs 10 usage: demo.py [-h] [--toy] [--num_epochs {5,10,20}] --num_layers NUM_LAYERS demo.py: error: the following arguments are required: --num_layers
- 實例3
-h
:輸出參數使用說明信息
>python demo.py -h usage: demo.py [-h] [--toy] [--num_epochs {5,10,20}] --num_layers NUM_LAYERS A description of what the program does optional arguments: -h, --help show this help message and exit --toy, -t Use only 50K samples of data --num_epochs {5,10,20} Number of epochs. --num_layers NUM_LAYERS Network depth.
action='store_true'說明
a.py文件的代碼如下:
import argparse parser = argparse.ArgumentParser() parser.add_argument('--t', help=' ', action='store_true', default=False) config = parser.parse_args() print(config.t)
直接運行python a.py,輸出結果False
運行python a.py --t,輸出結果True
也就是說,action='store_true',只要運行時該變量有傳參就將該變量設為True。