在編寫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-hk/n/330626.html