python中解析命令行參數(shù)的示例詳解
命令行參數(shù)
加密程序
考慮這樣一個加密程序,其中一個功能,是對一段字符串進行base64加密,另一個功能,是對一段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")
對于這樣一個功能,如果我希望通過命令行調(diào)用,然后快速得到結(jié)果,可能是像這樣的:
# 設(shè)置-e選項,進行加密 python base64_encrypt.py -e "sagegrass" # 設(shè)置-d選項,進行解密 python base64_encrypt.py -d "c2FnZWdyYXNz"
那么,該怎么做到呢?
sys.argv
命令行參數(shù)以列表的形式,保存于sys模塊的argv屬性中,具體來說
import sys print(sys.argv) # 對于python base64_encrypt.py -e "123456",結(jié)果為:['base64_encrypt.py', '-e', 'sagegrass'] # 對于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]))
此時,我們程序已經(jīng)可以正確處理-e以及-d的參數(shù)了。
復(fù)雜命令行參數(shù)
計算器案例
考慮這樣一個計算器程序,允許接受兩個參數(shù),并且選擇一個操作,進行加,減,乘,除的操作。
但是,也可以允許只接受一個參數(shù),并且選擇進行平方,或者開根號的操作。
同時,也應(yīng)該允許用戶可以先提供數(shù)字,或者后提供數(shù)字。
# 實現(xiàn)一個加法操作 python calculator.py 520 0.1314 --operation add python calculator.py -o add 520 0.1314 # 實現(xiàn)一個平方操作 python calculator.py -o square 5
因為操作較為復(fù)雜,用戶可能搞不清楚,所以同樣應(yīng)該提供一份幫助說明。
python calculator.py -h
那么,在這種情況下,如果還是使用sys.argv,并且在整個列表中,去解析命令行參數(shù),會非常麻煩。因此,需要更好的工具,去處理這個問題。
argparse
argparse是一個更好的工具,可以處理更加復(fù)雜的命令行參數(shù)。
創(chuàng)建ArgumentParser對象
parser = argparse.ArgumentParser(description="base64加解密")
添加位置參數(shù)
parser.add_argument("text", type=str, help="用于加解密的一段文本")
添加操作符
parser.add_argument("-e", "--encrypt", action="store_true", help="對文本進行base64加密") parser.add_argument("-d", "--decrypt", action="store_true", help="對文本進行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="對文本進行base64加密") parser.add_argument("-d", "--decrypt", action="store_true", help="對文本進行base64解密") args = parser.parse_args() if args.encrypt: print(encrypt_to_base64(args.text)) elif args.decrypt: print(decrypt_from_base64(args.text))
argparse處理計算器
import argparse import math parser = argparse.ArgumentParser(description="一個命令行的計算器") parser.add_argument("num1", type=float, help="第一個數(shù)字") parser.add_argument("num2", type=float, nargs='?', default=None, help="第二個數(shù)字(平方和開根號操作無需提供)") parser.add_argument("-o", "--operation", choices=["add", "sub", "mul", "div", "square", "sqrt"], default="add", help="選擇操作:add(加),sub(減),mul(乘),div(除),square(平方),sqrt(開根號)") args = parser.parse_args() if args.operation in ["add", "sub", "mul", "div"]: if args.num2 is None: parser.error(f"操作'{args.operation}'需要提供兩個數(shù)字。") elif args.operation in ["square", "sqrt"]: if args.num2 is not None: parser.error(f"操作'{args.operation}'只需要提供一個數(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 = "不能對負數(shù)開平方根!" else: result = math.sqrt(args.num1) else: result = None if result is not None: print(f"結(jié)果: {result}")
在這種情況下,使用-h查看幫助的時候,就會發(fā)現(xiàn),已經(jīng)自動生成了一份簡潔的幫助信息。
安裝為全局命令
全局命令
我們可能經(jīng)常觀察到這樣一種情況,在使用他人的第三方庫的時候,可以使用命令,例如,lunar-find 春節(jié) 2025
而對比我們的命令行程序,則必須要按照python xxx的形式使用,而且必須找到對應(yīng)的py文件,這并不方便,那么該可以讓我們也使用全局命令呢?
my-lunar-find
因為原本的lunar-find輸出格式不夠靈活,因此,我們對其進行簡單的重寫,以滿足可以輸出任意格式的時間。
關(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()
此時,可以通過提供--format,來按照需要格式化時間。
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的目錄下運行。
此時,是安裝了一個我們自己的模塊,my-lunar-find==1.0
調(diào)用命令:my-lunar-find 春節(jié) 2025
到此這篇關(guān)于python中解析命令行參數(shù)的示例詳解的文章就介紹到這了,更多相關(guān)python解析命令行參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Django中views數(shù)據(jù)查詢使用locals()函數(shù)進行優(yōu)化
這篇文章主要介紹了Django中views數(shù)據(jù)查詢使用locals()函數(shù)進行優(yōu)化,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Python3實現(xiàn)的簡單工資管理系統(tǒng)示例
這篇文章主要介紹了Python3實現(xiàn)的簡單工資管理系統(tǒng),涉及Python文件讀寫、數(shù)據(jù)遍歷、判斷等相關(guān)操作技巧,需要的朋友可以參考下2019-03-03利用Python腳本在Nginx和uwsgi上部署MoinMoin的教程
這篇文章主要介紹了利用Python腳本在Nginx和uwsgi上部署MoinMoin的教程,示例基于CentOS操作系統(tǒng),需要的朋友可以參考下2015-05-05Python虛擬機字節(jié)碼教程之裝飾器實現(xiàn)詳解
在本篇文章當(dāng)中主要給大家介紹在?cpython?當(dāng)中一些比較常見的字節(jié)碼,從根本上理解?python?程序的執(zhí)行。在本文當(dāng)中主要介紹一些?python?基本操作的字節(jié)碼,并且將從字節(jié)碼的角度分析函數(shù)裝飾器的原理2023-04-04