網站首頁 編程語言 正文
開發flavor_manager.py程序,來完成云主機類型管理的相關操作。
該文件擁有以下功能:
- 根據命令行參數,創建一個云主機類型,返回response。
- 查詢admin賬戶下所有的云主機類型
- 查詢給定具體名稱的云主機類型
- 支持刪除指定的id云主機類型
操作并不復雜,程序也相對較簡單,大致分為兩大部分
一,解析傳入的參數,將參數轉化為程序使用的變量
二,通過openstacksdk,使用獲得的變量完成相應行為。
基礎
首先構建我們的程序主題,肯定是需要argparse模塊,那么我們先把argparse模塊添加進我們的程序。
import argparse ? parse = argparse.ArgumentParser() args = parse.parse_args()
這做不了什么,也不能滿足題目的要求,所以我做出改變,既然我們需要讓程序擁有四種功能,那肯定要寫出四個相應的實現方法,而參數解析是必須的,那么我們需要這樣一個操作,當我們首先解析出需要的操作時,就進行反饋,將繼續的參數解析到相應的功能里,這樣就把四種功能分開,整個程序會變得很整潔。
創建解析對象
再回來看看題目,四種功能使用位置參數來分別區分,既然如此,我們第一個參數就設置為 option
,用來識別程序需要完成的功能,之后將帶入相應的解析中,并調取需要的程序來完成相應的行為。
整體思路就是這樣,可能你還沒跟上。那么讓我來演示第一步的解析:
import argparse ? parse = argparse.ArgumentParser() parse.add_argument('option') ? if __name__ == '__main__': args = parse.parse_args() print(args.option)
可以預見,這一步后,程序中被添加進了一個必須的參數,也就是我們需要的位置參數,如果你輸入 create
,那么程序中的args.option
就設置為create
,諸如此類,getall ,get,delete。也就很好區分了,接下來我們需要一個判斷,在不同的判斷中,我們讀入不同的參數。
解析位置參數
還是一步一步來吧,我們先以create
為例:
import argparse ? parse = argparse.ArgumentParser() parse.add_argument('option') parse.add_argument('-n', '--name', type=str, metavar='name', help='New flavor name') parse.add_argument('-m', '--ram', type=int, metavar='size-mb', default=256, help='Memory size in MB (DEFAULT 256M)') parse.add_argument('-v', '--vcpus', type=int, metavar='vcpus', default=1, help='Number of vcpus (default 1)') parse.add_argument('-d', '--disk', type=int, metavar='size-gb', default=0, help='Disk size in GB (default 0G)') parse.add_argument('-id', '--id', type=str, metavar='id', default='auto', help='Unique flavor ID') ? if __name__ == '__main__': args = parse.parse_args() if args.option == 'create': print("i will create new flavor")
可以看到,我已經把create這個行為剝離開來,接下來想必你已經知道我要做什么了。讓我們把四種功能補全看看。
解析可選參數
import argparse ? parse = argparse.ArgumentParser() parse.add_argument('option') parse.add_argument('-n', '--name', type=str, metavar='name', help='New flavor name') parse.add_argument('-m', '--ram', type=int, metavar='size-mb', default=256, help='Memory size in MB (DEFAULT 256M)') parse.add_argument('-v', '--vcpus', type=int, metavar='vcpus', default=1, help='Number of vcpus (default 1)') parse.add_argument('-d', '--disk', type=int, metavar='size-gb', default=0, help='Disk size in GB (default 0G)') parse.add_argument('-id', '--id', type=str, metavar='id', default='auto', help='Unique flavor ID') ? if __name__ == '__main__': args = parse.parse_args() if args.option == 'create': print("i will create new flavor") if args.option == 'getall': print("i will inquire all flavor") if args.option == 'get': print("i will get flavor by id") if args.option == 'delete': print("i will delete flavor by id")
很顯然,我還沒有把具體實現填入,僅僅只是更改了輸出用以區分,檢查一下我們是否解析了所有的參數。
填入程序主體
因為接下來我要將實現填入了,這是程序中較為重要的一步。
- -n指定flavor名稱,數據類型為字符串
- -m指定內存大小,數據類型為int,單位M
- -v指定虛擬cpu個數,數據類型為int
- -d指定磁盤大小,內存大小類型為int,單位G
- -id指定id,類型為字符串
在程序中我們已經做到了這些參數的解析,那么我們先填入create的實現,程序變成了下面這樣。
import argparse import opentack ? parse = argparse.ArgumentParser() parse.add_argument('option') parse.add_argument('-n', '--name', type=str, metavar='name', help='New flavor name') parse.add_argument('-m', '--ram', type=int, metavar='size-mb', default=256, help='Memory size in MB (DEFAULT 256M)') parse.add_argument('-v', '--vcpus', type=int, metavar='vcpus', default=1, help='Number of vcpus (default 1)') parse.add_argument('-d', '--disk', type=int, metavar='size-gb', default=0, help='Disk size in GB (default 0G)') parse.add_argument('-id', '--id', type=str, metavar='id', default='auto', help='Unique flavor ID') ? conn = opentack.connect( auth_url='http://192.168.10.25:5000', username='admin', password='passwordadmin', project_name='admin', project_domain_name='Default', ) ? ? def create_flavor(name, ram, vcpus, disk, flavorid): response = conn.create_flavor(name, ram, vcpus, disk, flavorid=flavorid) return response ? ? if __name__ == '__main__': args = parse.parse_args() if args.option == 'create': print(create_flavor(name=args.name, ram=args.ram, vcpus=args.vcpus, disk=args.disk, flavorid=args.id)) if args.option == 'getall': print("i will inquire all flavor") if args.option == 'get': print("i will get flavor by id") if args.option == 'delete': print("i will delete flavor by id")
我希望你還能看懂,在這一步,我導入了openstack這個包,我創建了一個連接對象conn
,這樣我就能操作openstack,我寫入了一個方法create_flavor
并指定了它可以傳入的參數,當option讀入create時,將會調用這個方法,并傳入相應的參數。由方法中的連接對象調取create_flaovr方法來完成最后的創建,完成后,這個方法將response返回并打印到終端。
我將運行的結果貼在下方:
?(venv) PS D:\Python> python .\demo3.py create -n flavor_small -m 1024 -v 1 -d 10 -id 100000
?openstack.compute.v2.flavor.Flavor(disk=10, OS-FLV-EXT-DATA:ephemeral=0, id=100000, os-flavor-access:is_public=True, name=flavor_small, ram=1024, rxtx_factor=1.0, swap=, vcpus=1, description=None, OS-FLV-DISABLED:disabled=False, extra_specs={}, location=Munch({'cloud': 'zed', 'region_name': '', 'zone': None, 'project': Munch({'id': '80074c3b4d09419e87ba0b8c05ce5164', 'name': 'admin', 'domain_id': None, 'domain_name': 'Default'})}))
很明顯,這是一個正確的輸出,如此,我就不廢話了,將所有功能快速的填入,只需要根據功能創建剩余的三個方法即可。
import argparse import openstack ? parse = argparse.ArgumentParser() parse.add_argument('option') parse.add_argument('-n', '--name', type=str, metavar='name', help='New flavor name') parse.add_argument('-m', '--ram', type=int, metavar='size-mb', default=256, help='Memory size in MB (DEFAULT 256M)') parse.add_argument('-v', '--vcpus', type=int, metavar='vcpus', default=1, help='Number of vcpus (default 1)') parse.add_argument('-d', '--disk', type=int, metavar='size-gb', default=0, help='Disk size in GB (default 0G)') parse.add_argument('-id', '--id', type=str, metavar='id', default='auto', help='Unique flavor ID') ? conn = openstack.connect( auth_url='http://192.168.10.25:5000', username='admin', password='passwordadmin', project_name='admin', project_domain_name='Default', ) ? ? def create_flavor(name, ram, vcpus, disk, flavorid): response = conn.create_flavor(name, ram, vcpus, disk, flavorid=flavorid) return response ? def getall_flavor(): response = conn.list_flavors() return response ? def get_flavor(id): response = conn.get_flavor_by_id(id) return response ? def delete_flavor(id): response = conn.delete_flavor(id) return response if __name__ == '__main__': args = parse.parse_args() if args.option == 'create': print(create_flavor(args.name, args.ram, args.vcpus, args.disk, args.id)) if args.option == 'getall': print(getall_flavor()) if args.option == 'get': print(get_flavor(args.id)) if args.option == 'delete': print(delete_flavor(args.id))
總結
到這里整個命令行腳本就大體完成了,如果需要別的改動,只需要按照這個思路修改就可以了。更多的argparse模塊的使用可以參照官方文檔的解析,非常詳細,而且配有非常多的案例,當然,這太麻煩了,我找到了一個寫的很不錯的文檔推薦給大家,我自己寫的就太糟糕了。
原文鏈接:https://juejin.cn/post/7194728797701144633
相關推薦
- 2022-12-11 Django?auth?應用模塊詳解_python
- 2023-03-01 pyinstaller打包后偶爾出現黑窗口一閃而過的問題及解決_python
- 2022-03-29 Python?dict的使用誤區你知道嗎_python
- 2023-01-17 Golang排序和查找使用方法介紹_Golang
- 2022-10-07 C語言順序查找算法介紹及示例_C 語言
- 2023-01-08 利用Qt實現獲取計算機的硬件信息_C 語言
- 2022-10-28 React?this.setState方法使用原理分析介紹_React
- 2022-07-06 C++如何切割String對象的方法_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支