python中解析命令行參數(shù)的示例詳解
命令行參數(shù)
加密程序
考慮這樣一個(gè)加密程序,其中一個(gè)功能,是對(duì)一段字符串進(jìn)行base64加密,另一個(gè)功能,是對(duì)一段base64字符串解密:
import base64 def encrypt_to_base64(input_string): byte_data = input_string.encode("utf-8") base64_encoded = base64.b64encode(byte_data) return base64_encoded.decode("utf-8") def decrypt_from_base64(base64_string): byte_data = base64_string.encode("utf-8") decoded_data = base64.b64decode(byte_data) return decoded_data.decode("utf-8") encrypt_to_base64("sagegrass") decrypt_from_base64("c2FnZWdyYXNz")
對(duì)于這樣一個(gè)功能,如果我希望通過命令行調(diào)用,然后快速得到結(jié)果,可能是像這樣的:
# 設(shè)置-e選項(xiàng),進(jìn)行加密 python base64_encrypt.py -e "sagegrass" # 設(shè)置-d選項(xiàng),進(jìn)行解密 python base64_encrypt.py -d "c2FnZWdyYXNz"
那么,該怎么做到呢?
sys.argv
命令行參數(shù)以列表的形式,保存于sys模塊的argv屬性中,具體來(lái)說
import sys print(sys.argv) # 對(duì)于python base64_encrypt.py -e "123456",結(jié)果為:['base64_encrypt.py', '-e', 'sagegrass'] # 對(duì)于python base64_encrypt.py -d "MTIzNDU2",結(jié)果為:['base64_encrypt.py', '-d', 'c2FnZWdyYXNz']
處理命令行參數(shù)
因此,根據(jù)sys.argv的返回結(jié)果,我們可以假設(shè),如果用戶的使用方法正確,那么,我們可以:
import base64 import sys def encrypt_to_base64(input_string): byte_data = input_string.encode("utf-8") base64_encoded = base64.b64encode(byte_data) return base64_encoded.decode("utf-8") def decrypt_from_base64(base64_string): byte_data = base64_string.encode("utf-8") decoded_data = base64.b64decode(byte_data) return decoded_data.decode("utf-8") if len(sys.argv) >= 3: if sys.argv[1] == "-e": print(encrypt_to_base64(sys.argv[2])) elif sys.argv[1] == "-d": print(decrypt_from_base64(sys.argv[2]))
此時(shí),我們程序已經(jīng)可以正確處理-e以及-d的參數(shù)了。
復(fù)雜命令行參數(shù)
計(jì)算器案例
考慮這樣一個(gè)計(jì)算器程序,允許接受兩個(gè)參數(shù),并且選擇一個(gè)操作,進(jìn)行加,減,乘,除的操作。
但是,也可以允許只接受一個(gè)參數(shù),并且選擇進(jìn)行平方,或者開根號(hào)的操作。
同時(shí),也應(yīng)該允許用戶可以先提供數(shù)字,或者后提供數(shù)字。
# 實(shí)現(xiàn)一個(gè)加法操作 python calculator.py 520 0.1314 --operation add python calculator.py -o add 520 0.1314 # 實(shí)現(xiàn)一個(gè)平方操作 python calculator.py -o square 5
因?yàn)椴僮鬏^為復(fù)雜,用戶可能搞不清楚,所以同樣應(yīng)該提供一份幫助說明。
python calculator.py -h
那么,在這種情況下,如果還是使用sys.argv,并且在整個(gè)列表中,去解析命令行參數(shù),會(huì)非常麻煩。因此,需要更好的工具,去處理這個(gè)問題。
argparse
argparse是一個(gè)更好的工具,可以處理更加復(fù)雜的命令行參數(shù)。
創(chuàng)建ArgumentParser對(duì)象
parser = argparse.ArgumentParser(description="base64加解密")
添加位置參數(shù)
parser.add_argument("text", type=str, help="用于加解密的一段文本")
添加操作符
parser.add_argument("-e", "--encrypt", action="store_true", help="對(duì)文本進(jìn)行base64加密") parser.add_argument("-d", "--decrypt", action="store_true", help="對(duì)文本進(jìn)行base64解密")
解析參數(shù)
args = parser.parse_args() if args.encrypt: print(encrypt_to_base64(args.text)) elif args.decrypt: print(decrypt_from_base64(args.text)) argparse處理base64加解密 import base64 import argparse def encrypt_to_base64(input_string): byte_data = input_string.encode("utf-8") base64_encoded = base64.b64encode(byte_data) return base64_encoded.decode("utf-8") def decrypt_from_base64(base64_string): byte_data = base64_string.encode("utf-8") decoded_data = base64.b64decode(byte_data) return decoded_data.decode("utf-8") parser = argparse.ArgumentParser(description="base64加解密") parser.add_argument("text", type=str, help="待加解密的文本") parser.add_argument("-e", "--encrypt", action="store_true", help="對(duì)文本進(jìn)行base64加密") parser.add_argument("-d", "--decrypt", action="store_true", help="對(duì)文本進(jìn)行base64解密") args = parser.parse_args() if args.encrypt: print(encrypt_to_base64(args.text)) elif args.decrypt: print(decrypt_from_base64(args.text))
argparse處理計(jì)算器
import argparse import math parser = argparse.ArgumentParser(description="一個(gè)命令行的計(jì)算器") parser.add_argument("num1", type=float, help="第一個(gè)數(shù)字") parser.add_argument("num2", type=float, nargs='?', default=None, help="第二個(gè)數(shù)字(平方和開根號(hào)操作無(wú)需提供)") parser.add_argument("-o", "--operation", choices=["add", "sub", "mul", "div", "square", "sqrt"], default="add", help="選擇操作:add(加),sub(減),mul(乘),div(除),square(平方),sqrt(開根號(hào))") args = parser.parse_args() if args.operation in ["add", "sub", "mul", "div"]: if args.num2 is None: parser.error(f"操作'{args.operation}'需要提供兩個(gè)數(shù)字。") elif args.operation in ["square", "sqrt"]: if args.num2 is not None: parser.error(f"操作'{args.operation}'只需要提供一個(gè)數(shù)字。") if args.operation == "add": result = args.num1 + args.num2 elif args.operation == "sub": result = args.num1 - args.num2 elif args.operation == "mul": result = args.num1 * args.num2 elif args.operation == "div": if args.num2 == 0: result = "除數(shù)不能為零!" else: result = args.num1 / args.num2 elif args.operation == "square": result = args.num1 ** 2 elif args.operation == "sqrt": if args.num1 < 0: result = "不能對(duì)負(fù)數(shù)開平方根!" else: result = math.sqrt(args.num1) else: result = None if result is not None: print(f"結(jié)果: {result}")
在這種情況下,使用-h查看幫助的時(shí)候,就會(huì)發(fā)現(xiàn),已經(jīng)自動(dòng)生成了一份簡(jiǎn)潔的幫助信息。
安裝為全局命令
全局命令
我們可能經(jīng)常觀察到這樣一種情況,在使用他人的第三方庫(kù)的時(shí)候,可以使用命令,例如,lunar-find 春節(jié) 2025
而對(duì)比我們的命令行程序,則必須要按照python xxx的形式使用,而且必須找到對(duì)應(yīng)的py文件,這并不方便,那么該可以讓我們也使用全局命令呢?
my-lunar-find
因?yàn)樵镜膌unar-find輸出格式不夠靈活,因此,我們對(duì)其進(jìn)行簡(jiǎn)單的重寫,以滿足可以輸出任意格式的時(shí)間。
關(guān)于原本的lunar-find工具,如果你并不了解,可以看看這篇文章,lunarcalendar的使用
import argparse from lunarcalendar.festival import festivals from lunarcalendar.solarterm import solarterms from itertools import chain from datetime import date def main(): parser = argparse.ArgumentParser(description="自行創(chuàng)建的lunar-find,修改了原本的日期格式") parser.add_argument("fs_or_st", type=str, help="需要查找的節(jié)日或節(jié)氣") parser.add_argument("year", type=int, help="年份") parser.add_argument("-f", "--format", default="%Y年%m月%d日", help="按照需要的格式重新格式化,%Y為年,%m為月,%d為日") args = parser.parse_args() for day in chain(festivals, solarterms): if day.get_lang("zh") == args.fs_or_st: formatted_time = day(args.year).strftime(args.format) print(formatted_time) if __name__ == "__main__": main()
此時(shí),可以通過提供--format,來(lái)按照需要格式化時(shí)間。
python my_lunar_find.py 春節(jié) 2025 # 輸出:2025年01月29日
python my_lunar_find.py 春節(jié) 2025 --format %Y/%m/%d # 輸出:2025/01/29
python my_lunar_find.py 春節(jié) 2025 --format %Y-%m-%d # 輸出:2025-01-29
安裝
編寫一份setup.py
from setuptools import setup setup( name="my_lunar_find", version="1.0", py_modules=["my_lunar_find"], entry_points={ "console_scripts": [ "my-lunar-find = my_lunar_find:main", ], }, )
安裝:pip install .
注意:其中的.代表當(dāng)前路徑,因此需要在包含setup.py的目錄下運(yùn)行。
此時(shí),是安裝了一個(gè)我們自己的模塊,my-lunar-find==1.0
調(diào)用命令:my-lunar-find 春節(jié) 2025
到此這篇關(guān)于python中解析命令行參數(shù)的示例詳解的文章就介紹到這了,更多相關(guān)python解析命令行參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Django中views數(shù)據(jù)查詢使用locals()函數(shù)進(jìn)行優(yōu)化
這篇文章主要介紹了Django中views數(shù)據(jù)查詢使用locals()函數(shù)進(jìn)行優(yōu)化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Python 實(shí)用技巧之利用Shell通配符做字符串匹配
這篇文章主要介紹了Python 實(shí)用技巧之利用Shell通配符做字符串匹配的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08python實(shí)現(xiàn)飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09Python3實(shí)現(xiàn)的簡(jiǎn)單工資管理系統(tǒng)示例
這篇文章主要介紹了Python3實(shí)現(xiàn)的簡(jiǎn)單工資管理系統(tǒng),涉及Python文件讀寫、數(shù)據(jù)遍歷、判斷等相關(guān)操作技巧,需要的朋友可以參考下2019-03-03Django如何利用uwsgi和nginx修改代碼自動(dòng)重啟
這篇文章主要介紹了Django如何利用uwsgi和nginx修改代碼自動(dòng)重啟問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05利用Python腳本在Nginx和uwsgi上部署MoinMoin的教程
這篇文章主要介紹了利用Python腳本在Nginx和uwsgi上部署MoinMoin的教程,示例基于CentOS操作系統(tǒng),需要的朋友可以參考下2015-05-05Python 實(shí)現(xiàn)PS濾鏡中的徑向模糊特效
這篇文章主要介紹了Python 實(shí)現(xiàn) PS 濾鏡中的徑向模糊特效,幫助大家更好的利用python處理圖片,感興趣的朋友可以了解下2020-12-12Python虛擬機(jī)字節(jié)碼教程之裝飾器實(shí)現(xiàn)詳解
在本篇文章當(dāng)中主要給大家介紹在?cpython?當(dāng)中一些比較常見的字節(jié)碼,從根本上理解?python?程序的執(zhí)行。在本文當(dāng)中主要介紹一些?python?基本操作的字節(jié)碼,并且將從字節(jié)碼的角度分析函數(shù)裝飾器的原理2023-04-04