python中解析命令行參數(shù)的示例詳解
命令行參數(shù)
加密程序
考慮這樣一個加密程序,其中一個功能,是對一段字符串進(jìn)行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選項(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屬性中,具體來說
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]))此時(shí),我們程序已經(jīng)可以正確處理-e以及-d的參數(shù)了。
復(fù)雜命令行參數(shù)
計(jì)算器案例
考慮這樣一個計(jì)算器程序,允許接受兩個參數(shù),并且選擇一個操作,進(jìn)行加,減,乘,除的操作。
但是,也可以允許只接受一個參數(shù),并且選擇進(jìn)行平方,或者開根號的操作。
同時(shí),也應(yīng)該允許用戶可以先提供數(shù)字,或者后提供數(shù)字。
# 實(shí)現(xiàn)一個加法操作 python calculator.py 520 0.1314 --operation add python calculator.py -o add 520 0.1314 # 實(shí)現(xiàn)一個平方操作 python calculator.py -o square 5
因?yàn)椴僮鬏^為復(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="對文本進(jìn)行base64加密")
parser.add_argument("-d", "--decrypt", action="store_true", help="對文本進(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="對文本進(jìn)行base64加密")
parser.add_argument("-d", "--decrypt", action="store_true", help="對文本進(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="一個命令行的計(jì)算器")
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 = "不能對負(fù)數(shù)開平方根!"
else:
result = math.sqrt(args.num1)
else:
result = None
if result is not None:
print(f"結(jié)果: {result}")在這種情況下,使用-h查看幫助的時(shí)候,就會發(fā)現(xiàn),已經(jīng)自動生成了一份簡潔的幫助信息。

安裝為全局命令
全局命令
我們可能經(jīng)常觀察到這樣一種情況,在使用他人的第三方庫的時(shí)候,可以使用命令,例如,lunar-find 春節(jié) 2025
而對比我們的命令行程序,則必須要按照python xxx的形式使用,而且必須找到對應(yīng)的py文件,這并不方便,那么該可以讓我們也使用全局命令呢?
my-lunar-find
因?yàn)樵镜膌unar-find輸出格式不夠靈活,因此,我們對其進(jì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,來按照需要格式化時(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í),是安裝了一個我們自己的模塊,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)文章
Python實(shí)現(xiàn)提取XML內(nèi)容并保存到Excel中的方法
這篇文章主要介紹了Python實(shí)現(xiàn)提取XML內(nèi)容并保存到Excel中的方法,涉及Python針對xml文件的讀取、解析以及Excel文件的寫入、保存等相關(guān)操作技巧,需要的朋友可以參考下2018-09-09
使用python構(gòu)建WebSocket客戶端的教程詳解
WebSocket是一種在客戶端和服務(wù)器之間實(shí)現(xiàn)雙向通信的協(xié)議,常用于實(shí)時(shí)聊天、實(shí)時(shí)數(shù)據(jù)更新等場景,Python提供了許多庫來實(shí)現(xiàn) WebSocket客戶端,本教程將介紹如何使用Python構(gòu)建WebSocket客戶端,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
MATLAB 全景圖切割及盒圖顯示的實(shí)現(xiàn)步驟
本文給大家分兩部分介紹,第一部分通過圖文的形式給大家介紹了全景圖切割的代碼,第二部分給大家介紹了盒圖展示效果的實(shí)現(xiàn)代碼,對MATLAB 全景圖切割相關(guān)知識感興趣的朋友,跟隨小編一起看看吧2021-05-05
python實(shí)現(xiàn)k-means聚類算法
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)k-means聚類算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
使用Django Form解決表單數(shù)據(jù)無法動態(tài)刷新的兩種方法
這篇文章主要介紹了使用Django Form解決表單數(shù)據(jù)無法動態(tài)刷新的兩種方法,需要的朋友可以參考下2017-07-07
Python?Pandas庫簡介及一些常見用法總結(jié)
Pandas庫是Python的免費(fèi)、開源的第三方庫,Pandas是Python數(shù)據(jù)分析必不可少的工具之一,這篇文章主要介紹了Python?Pandas庫簡介及一些常見用法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-07-07
python?中?lxml?的?etree?標(biāo)簽解析
這篇文章主要介紹了python?中l(wèi)xml的etree?標(biāo)簽解析,文章圍繞主題展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)或工作有所幫助2022-04-04
Gauss-Seidel迭代算法的Python實(shí)現(xiàn)詳解
這篇文章主要介紹了Gauss-Seidel迭代算法的Python實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-06-06

