您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python argparse命令參數(shù)與config配置參數(shù)怎么使用”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“Python argparse命令參數(shù)與config配置參數(shù)怎么使用”文章能幫助大家解決問題。
argparse 是 Python 內(nèi)置的一個(gè)用于命令項(xiàng)選項(xiàng)與參數(shù)解析的模塊,通過在程序中定義好我們需要的參數(shù),然后在程序啟動命令行傳遞我們想要改變的參數(shù)
步驟:
(1)import argparse 首先導(dǎo)入模塊
(2)parser = argparse.ArgumentParser() 創(chuàng)建一個(gè)解析對象
(3)parser.add_argument() 向該對象中添加你要關(guān)注的命令行參數(shù)和選項(xiàng)。第三步中,可以添加多個(gè)我們想要的參數(shù)。如下面的例子
(4)parser.parse_args() 進(jìn)行解析
(5)vars()將解析值轉(zhuǎn)換成字典對象,然后就可以使用了
例子如下,文件名為main.py
# 文件名為main.py class DoSomething(): def working(self): pass if __name__ == '__main__': import argparse # 步驟一:導(dǎo)入模塊 # 啟動參數(shù) parser = argparse.ArgumentParser() # 步驟二:創(chuàng)建一個(gè)解析對象 # 步驟三:向解析對象中添加你要關(guān)注的命令行參數(shù)和選項(xiàng) parser.add_argument('--labels_dir', type=str, help='標(biāo)簽?zāi)夸?#39;, default='./data/labels') # help的值就是你對這個(gè)參數(shù)labels_dir的作用描述 parser.add_argument('--models_dir', type=str, help='模型跟目錄', default='./data/models') # type的值就是你對這個(gè)參數(shù)models_dir數(shù)據(jù)類型的指定 parser.add_argument('--last_dir_name', type=str, help='文件后序名', default='_seq_month_serial') # default的值就是你對這個(gè)參數(shù)last_dir_name設(shè)置的默認(rèn)值 parser.add_argument('--batch_size', type=int, help='批次大小', default=64) parser.add_argument('--classes', type=int, help='聚類數(shù)', default=9) parser.add_argument('--predict_date', type=str, help='預(yù)測年月', default='202101') parser.add_argument('--last_date', type=str, help='輸入最后年月', default='202001') parser.add_argument('--only_predict', action="store_true", # action的值就是你對這個(gè)參數(shù)only_predict設(shè)置了布爾數(shù)據(jù)類型,并且默認(rèn)值為True help='只識別,不訓(xùn)練') parser.add_argument('--delete_model', action="store_true", help='先刪除模型,僅在訓(xùn)練時(shí)使用') parser.add_argument('--hidden_size', type=int, help='模型維度', default=128) parser.add_argument('--learning_rate', type=float, help='學(xué)習(xí)速率', default=5e-4) parser.add_argument('--export_excel', action="store_true", help='導(dǎo)出excel') parser.add_argument('--loss_type', type=str, help='loss類型', default='categorical_crossentropy') parser.add_argument('--avg_model_num', type=int, help='平均模型數(shù)', default=10) parser.add_argument('--get_data', action="store_true", help='重新獲取數(shù)據(jù)') argparse_args = parser.parse_args() # 步驟四:進(jìn)行解析 # vars() 函數(shù)返回對象object的屬性和屬性值的字典對象。 args_default = vars(argparse_args) # 步驟五,將解析值轉(zhuǎn)換成字典對象,然后就可以使用了 print(type(argparse_args)) print(argparse_args) print('分割線') print(type(args_default)) # 是字典數(shù)據(jù)類型 print(args_default) # 將這個(gè)字典傳入到程序中,就可以拿到這些參數(shù)的所有值了
運(yùn)行,得出下面的結(jié)果
<class 'argparse.Namespace'>
Namespace(labels_dir='./data/labels', models_dir='./data/models', last_dir_name='_seq_month_serial', batch_size=64, classes=9, predict_date='202101', last_date='202001', only_predict=False, delete_model=False, hidden_size=128, learning_rate=0.0005, export_excel=False, loss_type='categorical_crossentropy', avg_model_num=10, get_data=False)
分割線
<class 'dict'>
{'labels_dir': './data/labels', 'models_dir': './data/models', 'last_dir_name': '_seq_month_serial', 'batch_size': 64, 'classes': 9, 'predict_date': '202101', 'last_date': '202001', 'only_predict': False, 'delete_model': False, 'hidden_size': 128, 'learning_rate': 0.0005, 'export_excel': False, 'loss_type': 'categorical_crossentropy', 'avg_model_num': 10, 'get_data': False}
上面的對法如果你程序就只是一個(gè)文件,那就已經(jīng)滿足了。如果你項(xiàng)目比較大,有很多基礎(chǔ)的命令配置參數(shù)在很多啟動文件中都用到了,當(dāng)然你可以在各自的啟動文件中都寫上,但是如果你這么做,后續(xù)參數(shù)值的修改和變動將非常麻煩,因?yàn)槟阈枰瑫r(shí)修改很多啟動文件,有沒有辦法修改一個(gè)啟動文件就可以呢。辦法是有的。
通過新建一個(gè)類來實(shí)現(xiàn),文件名為share_args.py。這個(gè)類里面寫上你所需要的命令參數(shù)
class ShareArgs(): # args就是整個(gè)項(xiàng)目經(jīng)常使用到的默認(rèn)參數(shù),經(jīng)常不需要進(jìn)行變動,所以就寫在這里。然后通過update的更新寫到啟動文件的字典參數(shù)里面 args = { "labels_dir":"./shop_group/month_w_amt/data/labels", # 標(biāo)簽?zāi)夸? "labels_output_dir":"./shop_group/month_w_amt/data/labels_output", # 聚類導(dǎo)出標(biāo)簽?zāi)夸? "common_datas_dir":"./data", # 共用數(shù)據(jù)目錄 "only_predict": False, # 只識別,不訓(xùn)練 "delete_model": True, # 先刪除模型,僅在訓(xùn)練時(shí)使用 "export_excel": False, # 導(dǎo)出excel "classes": 12, # 聚類數(shù) "batch_size": 16, "hidden_size": 32, "max_nrof_epochs": 100, "learning_rate": 0.0005, "loss_type": "categorical_crossentropy", "avg_model_num": 10, "steps_per_epoch": 4.0, # 4.0 "lr_callback_patience": 4, "lr_callback_cooldown": 1, "early_stopping_callback_patience": 6, "get_data": True, } def get_args(): # 獲取參數(shù)字典 return ShareArgs.args def set_args(args): # 一次性更新修改所有參數(shù)字典的值 ShareArgs.args = args def set_args_value(key, value): # 根據(jù)索引更新參數(shù)字典的值 ShareArgs.args[key] = value def get_args_value(key, default_value=None): # 獲取指定索引的默認(rèn)參數(shù)的值 return ShareArgs.args.get(key, default_value) def contain_key(key): # 判斷索引是否在參數(shù)字典里面 return key in ShareArgs.args.keys() def update(args): # 用于更新字典中的鍵/值對,可以修改存在的鍵對應(yīng)的值,也可以添加新的鍵/值對到字典中 ShareArgs.args.update(args)
啟動文件如下,文件名為main.py
import sys base_dir = '' sys.path.append(base_dir) from share_args import ShareArgs class DoSomething(): def working(self): print('ShareArgs.args : ',ShareArgs.args) if __name__ == '__main__': import argparse # 步驟一:導(dǎo)入模塊 # 啟動參數(shù) parser = argparse.ArgumentParser() # 步驟二:創(chuàng)建一個(gè)解析對象 # 步驟三:向解析對象中添加你要關(guān)注的命令行參數(shù)和選項(xiàng) parser.add_argument('--labels_dir', type=str, help='標(biāo)簽?zāi)夸?#39;, default='./data/labels') # help的值就是你對這個(gè)參數(shù)labels_dir的作用描述 parser.add_argument('--models_dir', type=str, help='模型跟目錄', default='./data/models') # type的值就是你對這個(gè)參數(shù)models_dir數(shù)據(jù)類型的指定 parser.add_argument('--last_dir_name', type=str, help='文件后序名', default='_seq_month_serial') # default的值就是你對這個(gè)參數(shù)last_dir_name設(shè)置的默認(rèn)值 parser.add_argument('--batch_size', type=int, help='批次大小', default=64) parser.add_argument('--classes', type=int, help='聚類數(shù)', default=9) parser.add_argument('--predict_date', type=str, help='預(yù)測年月', default='202101') parser.add_argument('--last_date', type=str, help='輸入最后年月', default='202001') parser.add_argument('--only_predict', action="store_true", # action的值就是你對這個(gè)參數(shù)only_predict設(shè)置了布爾數(shù)據(jù)類型,并且默認(rèn)值為True help='只識別,不訓(xùn)練') parser.add_argument('--delete_model', action="store_true", help='先刪除模型,僅在訓(xùn)練時(shí)使用') parser.add_argument('--hidden_size', type=int, help='模型維度', default=128) parser.add_argument('--learning_rate', type=float, help='學(xué)習(xí)速率', default=5e-4) parser.add_argument('--export_excel', action="store_true", help='導(dǎo)出excel') parser.add_argument('--loss_type', type=str, help='loss類型', default='categorical_crossentropy') parser.add_argument('--avg_model_num', type=int, help='平均模型數(shù)', default=10) parser.add_argument('--get_data', action="store_true", help='重新獲取數(shù)據(jù)') argparse_args = parser.parse_args() # 步驟四:進(jìn)行解析 # vars() 函數(shù)返回對象object的屬性和屬性值的字典對象。 args_default = vars(argparse_args) # 步驟五,將解析值轉(zhuǎn)換成字典對象,然后就可以使用了 # print(type(argparse_args)) # print(argparse_args) # print('分割線') # print(type(args_default)) # 是字典數(shù)據(jù)類型 # print(args_default) # 將這個(gè)字典傳入到程序中,就可以拿到這些參數(shù)的所有值了 ShareArgs.update(args_default) # 將很多的默認(rèn)參數(shù)更新到這里來 DoSomething().working()
結(jié)果如下??梢园l(fā)現(xiàn),類中默認(rèn)的參數(shù)全部拿到了
ShareArgs.args : {'labels_dir': './data/labels', 'labels_output_dir': './yongjian/shop_group/month_w_amt/data/labels_output', 'common_datas_dir': './yongjian/data', 'only_predict': False, 'delete_model': False, 'export_excel': False, 'classes': 9, 'batch_size': 64, 'hidden_size': 128, 'max_nrof_epochs': 100, 'learning_rate': 0.0005, 'loss_type': 'categorical_crossentropy', 'avg_model_num': 10, 'steps_per_epoch': 4.0, 'lr_callback_patience': 4, 'lr_callback_cooldown': 1, 'early_stopping_callback_patience': 6, 'get_data': False, 'models_dir': './data/models', 'last_dir_name': '_seq_month_serial', 'predict_date': '202101', 'last_date': '202001'}
在第二部分中已經(jīng)解釋了如何配合多個(gè)啟動文件的問題,用一個(gè)類來解決。但是呢,還有個(gè)問題就是如果有很多配置參數(shù)變動比較頻繁,例如連接數(shù)據(jù)庫的賬號、密碼、端口、ip等等,這些數(shù)據(jù)變動多,而且數(shù)據(jù)需要一定的保密性,所以不能通過建一個(gè)類來進(jìn)行傳遞,那該怎么辦呢?
通過讀取配置文件config.yml來進(jìn)行解決??梢园颜江h(huán)境的配置信息放到config.yml里面,測試環(huán)境的配置信息放到configtest.py。這樣可以確保整個(gè)項(xiàng)目讀取到的共用信息的一致的,修改起來也很方便
下面的流程先解釋細(xì)節(jié),然后再展現(xiàn)總體,請耐心看到最后
config.yml的樣式如下,表示正式環(huán)境的信息。
common:
server_ip: 10.23.167.20:9988
mip_server_ip: test-mip.ur.com.cn:8768
common_datas_dir: ./data
month_category_scale:
# export_db_database: test_ims # 測試
export_db_database: mimp # 正式
# export_db_host: 192.168.130.13 # 測試
export_db_host: 10.20.167.145 # 正式
# export_db_password: 123456 # 測試
export_db_password: 654321 # 正式
export_db_port: 4000
export_db_user: root
export_dir: ./month_category_scale/data/export
labels_dir: ./month_category_scale/data/labels
log_dir: ./month_category_scale/logs
log_level: DEBUG
models_dir: ./month_category_scale/data/models
ur_bi_dw_auth_mechanism: LDAP
ur_bi_dw_database: ur_ai_dw
ur_bi_dw_host: 10.23.167.20
ur_bi_dw_password: 123456789
ur_bi_dw_port: 21562
ur_bi_dw_save_dir: ./month_category_scale/data/ur_bi_dw_data
ur_bi_dw_user: urbiyetes
然后再建立一個(gè)文件,用于讀取配置文件,文件名為:config_helper.py
# !pip install PyYaml # yaml文件的解析去B站看個(gè)10分鐘教學(xué)視頻即可學(xué)會,在這里不詳細(xì)解釋了 import yaml def read_yml(file_path): with open(file_path, 'r', encoding='utf-8') as file: return yaml.load(file, Loader=yaml.FullLoader) def get_config(base_dir, logger=None): # logger 表示日志對象 if not os.path.exists(os.path.join(base_dir, './data/is_local.txt')): if logger: logger.info('加載正式環(huán)境配置:./config.yml') else: print('加載正式環(huán)境配置:./config.yml') config = read_yml(os.path.join(base_dir, './config.yml')) else: if logger: logger.info('加載測試環(huán)境配置:./config_dev.yml') else: print('加載測試環(huán)境配置:./config_dev.yml') config = read_yml(os.path.join(base_dir, './config_dev.yml')) return config
改變之后的main.py文件如下
import sys base_dir = '' sys.path.append(base_dir) from share_args import ShareArgs class DoSomething(): def working(self, config=None): print('ShareArgs.args : ',ShareArgs.args) print('config', config) if __name__ == '__main__': import argparse # 步驟一:導(dǎo)入模塊 # 啟動參數(shù) parser = argparse.ArgumentParser() # 步驟二:創(chuàng)建一個(gè)解析對象 # 步驟三:向解析對象中添加你要關(guān)注的命令行參數(shù)和選項(xiàng) parser.add_argument('--labels_dir', type=str, help='標(biāo)簽?zāi)夸?#39;, default='./data/labels') # help的值就是你對這個(gè)參數(shù)labels_dir的作用描述 parser.add_argument('--models_dir', type=str, help='模型跟目錄', default='./data/models') # type的值就是你對這個(gè)參數(shù)models_dir數(shù)據(jù)類型的指定 parser.add_argument('--last_dir_name', type=str, help='文件后序名', default='_seq_month_serial') # default的值就是你對這個(gè)參數(shù)last_dir_name設(shè)置的默認(rèn)值 parser.add_argument('--batch_size', type=int, help='批次大小', default=64) parser.add_argument('--classes', type=int, help='聚類數(shù)', default=9) parser.add_argument('--predict_date', type=str, help='預(yù)測年月', default='202101') parser.add_argument('--last_date', type=str, help='輸入最后年月', default='202001') parser.add_argument('--only_predict', action="store_true", # action的值就是你對這個(gè)參數(shù)only_predict設(shè)置了布爾數(shù)據(jù)類型,并且默認(rèn)值為True help='只識別,不訓(xùn)練') parser.add_argument('--delete_model', action="store_true", help='先刪除模型,僅在訓(xùn)練時(shí)使用') parser.add_argument('--hidden_size', type=int, help='模型維度', default=128) parser.add_argument('--learning_rate', type=float, help='學(xué)習(xí)速率', default=5e-4) parser.add_argument('--export_excel', action="store_true", help='導(dǎo)出excel') parser.add_argument('--loss_type', type=str, help='loss類型', default='categorical_crossentropy') parser.add_argument('--avg_model_num', type=int, help='平均模型數(shù)', default=10) parser.add_argument('--get_data', action="store_true", help='重新獲取數(shù)據(jù)') argparse_args = parser.parse_args() # 步驟四:進(jìn)行解析 # vars() 函數(shù)返回對象object的屬性和屬性值的字典對象。 args_default = vars(argparse_args) # 步驟五,將解析值轉(zhuǎn)換成字典對象,然后就可以使用了 # print(type(argparse_args)) # print(argparse_args) # print('分割線') # print(type(args_default)) # 是字典數(shù)據(jù)類型 # print(args_default) # 將這個(gè)字典傳入到程序中,就可以拿到這些參數(shù)的所有值了 ShareArgs.update(args_default) # 將很多的默認(rèn)參數(shù)更新到這里來 # DoSomething().working() import config_helper as config_helper config = config_helper.get_config(base_dir, None) DoSomething().working(config)
結(jié)果如下
加載正式環(huán)境配置:./config.yml
ShareArgs.args : {'labels_dir': './data/labels', 'labels_output_dir': './shop_group/month_w_amt/data/labels_output', 'common_datas_dir': './data', 'only_predict': False, 'delete_model': False, 'export_excel':
False, 'classes': 9, 'batch_size': 64, 'hidden_size': 128, 'max_nrof_epochs': 100, 'learning_rate': 0.0005, 'loss_type': 'categorical_crossentropy', 'avg_model_num': 10, 'steps_per_epoch': 4.0, 'lr_callback_patience': 4, 'lr_callback_cooldown': 1, 'early_stopping_callback_patience': 6, 'get_data': False, 'models_dir': './data/models', 'last_dir_name': '_seq_month_serial', 'predict_date': '202101', 'last_date': '202001'}
config : {'common': {'server_ip': '10.23.167.20:9988', 'mip_server_ip': 'test-mip.ur.com.cn:8768', 'common_datas_dir': './data'}, 'month_category_scale': {'export_db_database': 'mimp', 'export_db_host': '10.20.167.145', 'export_db_password': 654321, 'export_db_port': 4000, 'export_db_user': 'root', 'export_dir': './month_category_scale/data/export', 'labels_dir': './month_category_scale/data/labels', 'log_dir': './month_category_scale/logs', 'log_level': 'DEBUG', 'models_dir': './month_category_scale/data/models', 'ur_bi_dw_auth_mechanism': 'LDAP', 'ur_bi_dw_database': 'ur_ai_dw', 'ur_bi_dw_host': '10.23.167.20', 'ur_bi_dw_password': 123456789, 'ur_bi_dw_port': 21562, 'ur_bi_dw_save_dir': './month_category_scale/data/ur_bi_dw_data', 'ur_bi_dw_user': 'urbiyetes'}}
關(guān)于“Python argparse命令參數(shù)與config配置參數(shù)怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。