最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中解析命令行參數(shù)的示例詳解

 更新時(shí)間:2024年11月08日 08:48:19   作者:仙草哥哥  
這篇文章主要為大家詳細(xì)介紹了python中命令行參數(shù)的解析,并做一個命令行程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下

命令行參數(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實(shí)現(xiàn)提取XML內(nèi)容并保存到Excel中的方法,涉及Python針對xml文件的讀取、解析以及Excel文件的寫入、保存等相關(guān)操作技巧,需要的朋友可以參考下
    2018-09-09
  • 使用python構(gòu)建WebSocket客戶端的教程詳解

    使用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)步驟

    MATLAB 全景圖切割及盒圖顯示的實(shí)現(xiàn)步驟

    本文給大家分兩部分介紹,第一部分通過圖文的形式給大家介紹了全景圖切割的代碼,第二部分給大家介紹了盒圖展示效果的實(shí)現(xiàn)代碼,對MATLAB 全景圖切割相關(guān)知識感興趣的朋友,跟隨小編一起看看吧
    2021-05-05
  • python實(shí)現(xiàn)k-means聚類算法

    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)刷新的兩種方法

    這篇文章主要介紹了使用Django Form解決表單數(shù)據(jù)無法動態(tài)刷新的兩種方法,需要的朋友可以參考下
    2017-07-07
  • python 中字典嵌套列表的方法

    python 中字典嵌套列表的方法

    今天小編就為大家分享一篇python 中字典嵌套列表的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python?Pandas庫簡介及一些常見用法總結(jié)

    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?中?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)詳解

    這篇文章主要介紹了Gauss-Seidel迭代算法的Python實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-06-06
  • 詳解Python單元測試的兩種寫法

    詳解Python單元測試的兩種寫法

    python的兩個單元測試包分別是 doctest 和 unittest,這兩個包的使用起來各有長處,適用于不同的場景,這篇文章主要介紹了Python單元測試的兩種寫法,需要的朋友可以參考下
    2022-07-07

最新評論

乌苏市| 休宁县| 连平县| 桐乡市| 榆树市| 建瓯市| 常宁市| 大理市| 夏河县| 广宗县| 辛集市| 广丰县| 建瓯市| 四平市| 平乡县| 山阳县| 康定县| 张家界市| 永德县| 南华县| 博白县| 滨州市| 江都市| 麦盖提县| 冕宁县| 怀宁县| 托克逊县| 贡觉县| 玉山县| 宁夏| 仲巴县| 五莲县| 石楼县| 柏乡县| 新乡县| 军事| 青岛市| 比如县| 固安县| 桓台县| 册亨县|