使用Python的Sys模塊的命令行參數解析功能

在編寫Python腳本時,有時候需要從命令行接收參數以便靈活地定製程序的行為。Sys模塊是Python自帶的一個模塊,提供了處理命令行參數的功能,使得程序的命令行輸入輸出更加方便。

一、sys.argv的基本用法

sys.argv是一個包含命令行參數的列表,其中第一個元素是程序本身的名稱。在需要從命令行獲取一些參數的時候,可以使用sys.argv[1:]獲取所有參數,然後進行處理。

import sys

print("腳本名稱:", sys.argv[0])
print("命令行參數:", sys.argv[1:])

運行該腳本,假設命名為test.py,可以輸入以下內容:

$ python test.py arg1 arg2 arg3

程序將輸出:

腳本名稱: test.py
命令行參數: ['arg1', 'arg2', 'arg3']

從上面的代碼和運行結果可以看出,使用sys.argv可以輕鬆獲取命令行參數,方便程序的使用和管理。

二、使用argparse解析參數

雖然使用sys.argv獲取命令行參數是一種有效的方法,但是當參數的數量很多時,代碼的可讀性將會降低。同時,需要對參數進行類型轉換,對於一些非法參數需要做校驗。因此,Python 2.7版本中引入了argparse庫,支持解析命令行參數,提高了程序的可讀性和可維護性。

下面是一個使用argparse庫進行參數解析的示例代碼:

import argparse

parser = argparse.ArgumentParser(description='這個程序xxx')

parser.add_argument('-a', '--arg1', type=int, help='第一個參數')
parser.add_argument('-b', '--arg2', type=str, choices=['choice1', 'choice2'], help='第二個參數')
parser.add_argument('-c', '--arg3', action='store_true', help='第三個參數')

args = parser.parse_args()

print('參數arg1:', args.arg1)
print('參數arg2:', args.arg2)
print('參數arg3:', args.arg3)

上面的代碼中,parser對象是argparse庫的一個核心概念。Parser對象用於描述所有可能的命令行參數,並將它們轉換為可用於Python的對象。add_argument()函數用於添加需要解析的參數。-a和–arg1是參數名或選項名,type是表示該參數應該被解析成的類型,help是參數的幫助信息。

在上面的代碼中,參數arg1是一個整數類型,並且是必選參數,因此加了type=int參數;參數arg2是一個字符串類型,並且只能從給定選項中選擇,因此加了choices=[‘choice1’, ‘choice2’]參數;參數arg3是一個布爾型,如果在命令行中出現,則設置為True,否則為False,因此加了action=’store_true’參數。

以上腳本在命令行中的使用方法如下:

$ python test.py -a 123 -b choice1 -c

腳本將輸出:

參數arg1: 123
參數arg2: choice1
參數arg3: True

顯然,使用argparse庫可以輕鬆完成複雜參數的解析,代碼具有高可讀性和可維護性。

三、命令行參數的高級用法

在使用命令行參數時,還可以使用一些高級技巧,從而提高代碼的靈活性和擴展性。

1.參數組合

有些參數需要組合使用才能達到預期的效果。例如參數-r和-d表示遞歸處理目錄和刪除,組合在一起表示遞歸刪除目錄。ARGPARSE提供了一定的支持,但是很麻煩。實際上,可以手動進行參數解析,從而更加自由地組合參數。

import argparse

parser = argparse.ArgumentParser(description='這個程序xxx')

parser.add_argument('--recursive', '-r', action='store_true', default=False, help='遞歸處理目錄')
parser.add_argument('--delete', '-d', action='store_true', default=False, help='刪除文件或目錄')

args = parser.parse_known_args()

if args[0].recursive and args[0].delete:
    print('遞歸刪除')
elif args[0].delete:
    print('刪除')
elif args[0].recursive:
    print('遞歸')
else:
    print('normal')

在上面的代碼中,使用parser.parse_known_args()方法來解析參數。這個方法返回一個元組,第一個元素是一個對象,包含解析後的參數;第二個元素是一個列表,包含剩餘的命令行字符串。在本例中,我們只關心第一個元素。這個方法非常方便,因為在不想在參數解析完成前忽略參數和選項。

2.參數文件

如果命令行參數的數量太多,甚至無法放到命令行中,那麼我們可以使用參數文件的方式,把所有的參數寫到文件中。在運行程序的時候可以將文件名作為參數輸入。

import argparse

parser = argparse.ArgumentParser(description='這個程序xxx')

parser.add_argument('--config', '-c', type=str, default='args.conf', help='參數文件名')

args, unknown = parser.parse_known_args()
with open(args.config) as f:
    data = f.read().split()

parser.parse_args(unknown, namespace=args)

print('參數1:', args.arg1)
print('參數2:', args.arg2)
print('參數3:', args.arg3)

上面代碼中, -c或–config參數用於傳遞參數文件的文件名。在參數解析之前打開該文件,讀取其中內容,將其轉換為一個列表或元組,並加入相應的解析器中。然後進行參數解析。

假設已經有一個參數文件args.conf,其中的內容如下:

2  3  4

那麼,通過以下命令即可將args.conf文件中的參數傳入腳本中:

$ python test.py -c args.conf

運行結果如下:

參數1: 2
參數2: 3
參數3: 4

總結

本文主要闡述了Python中使用sys模塊的命令行參數解析功能,以及使用argparse庫完成參數解析的方法。同時,介紹了一些高級的命令行參數用法,包括參數組合和參數文件等。這些技巧可以幫助工程師更好地編寫靈活和擴展性高的腳本。完整代碼如下:

import argparse
import sys

def main(args):
    print('args:', args)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="使用argparse解析命令行參數")
    parser.add_argument('-i', '--input', metavar='input', type=str, required=True, help='輸入文件路徑')
    parser.add_argument('-o', '--output', metavar='output', type=str, help='輸出文件路徑')
    parser.add_argument('-t', '--type', metavar='type', type=str, choices=['csv', 'json'], default='csv', help='輸出文件類型')
    parser.add_argument('--encoding', metavar='encoding', type=str, help='輸入文件編碼方式')
    parser.add_argument('--version', action='version', version='%(prog)s 1.0')
    args = parser.parse_args()

    # 參數解析完成後,調用主函數處理輸入和輸出
    main(args)

原創文章,作者:FLGFV,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/330626.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FLGFV的頭像FLGFV
上一篇 2025-01-16 15:46
下一篇 2025-01-16 15:46

相關推薦

發表回復

登錄後才能評論