Python argparse 用法與範例

本篇介紹 Python argparse 用法與範例,在寫 Python 程式時,有時需要傳入一些參數給程式,然後在程式裡處理這些 argv,argv 在另外這篇有介紹過了,這篇要教更快更方便的 argparse 模組,讓你在短時間內加好一堆參數選項,還省去處理變數類型轉換問題,這麼厲害的 argparse 模組還不趕緊學習起來!

解析單一個參數

Python argparse 要傳入單一參數的話寫法如下,

python3-argparse.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse

def get_parser():
parser = argparse.ArgumentParser(description='my description')
parser.add_argument('string', type=str)
return parser

if __name__ == '__main__':
parser = get_parser()
args = parser.parse_args()
print(args.string)
print(type(args.string))

結果如下,

1
2
3
$ ./python3-argparse.py hello 
hello
<class 'str'>

但是這樣的寫法只能接受單一個參數,如果傳入多個參數的話就會報錯,

1
2
3
$ ./python3-argparse.py hello world
usage: python3-argparse.py [-h] string
python3-argparse.py: error: unrecognized arguments: world

如果要傳入多個參數的話請看下一節

解析多個參數

基於上述的例子,Python argparse 要傳入多個參數的話寫法如下,加上 nargs='+' 表示可以接受多個參數,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse

def get_parser():
parser = argparse.ArgumentParser(description='my description')
parser.add_argument('strings', type=str, nargs='+')
return parser

if __name__ == '__main__':
parser = get_parser()
args = parser.parse_args()
print(args.strings)
print(type(args.strings))
print(args.strings[0])

結果如下,

1
2
3
4
$ ./python3-argparse2.py hello world
['hello', 'world']
<class 'list'>
hello

接下來示範網路程式常常會用到的例子,傳入 ip 跟 port 這兩個參數給程式,並且讓 ip 的變數類型為 str,port 的變數類型為 int,以便套用到後續程式的設定,範例如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse

def get_parser():
parser = argparse.ArgumentParser(description='my description')
parser.add_argument('ip', type=str)
parser.add_argument('port', type=int)
return parser

if __name__ == '__main__':
parser = get_parser()
args = parser.parse_args()
print(args.ip + ':' + str(args.port))
print(type(args.ip))
print(type(args.port))

結果如下,

1
2
3
4
$ ./python3-argparse3.py 192.168.1.2 8080
192.168.1.2:8080
<class 'str'>
<class 'int'>

參數選項

那如果今天我希望不輸入任何參數也能讓程式順利執行的話呢?那麼這些設定值都給它個預設值,

python3-argparse4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse

def get_parser():
parser = argparse.ArgumentParser(description='my description')
parser.add_argument('--ip', default='0.0.0.0')
parser.add_argument('--port', default='8080', type=int)
return parser

if __name__ == '__main__':
parser = get_parser()
args = parser.parse_args()
print('ip: ' + args.ip)
print('port: ' + str(args.port))

結果如下,

1
2
3
4
5
6
7
8
9
$ ./python3-argparse4.py
ip: 0.0.0.0
port: 8080
$ ./python3-argparse4.py --ip 192.168.1.2
ip: 192.168.1.2
port: 8080
$ ./python3-argparse4.py --ip 192.168.1.2 --port 80
ip: 192.168.1.2
port: 80

短參數選項

這邊介紹 argparse 的短參數選項,承上述例子,加入 --ip 的短選項為 -i 以及 --port 的短選項為 -p,範例如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse

def get_parser():
parser = argparse.ArgumentParser(description='my description')
parser.add_argument('-i', '--ip', default='0.0.0.0')
parser.add_argument('-p', '--port', default='8080', type=int)
return parser

if __name__ == '__main__':
parser = get_parser()
args = parser.parse_args()
print('ip: ' + args.ip)
print('port: ' + str(args.port))

實際上用起來結果如下,

1
2
3
$ ./python3-argparse5.py -i 192.168.1.2 -p 80
ip: 192.168.1.2
port: 80

其它參考
Argparse 教學 — Python 3 說明文件
https://docs.python.org/zh-tw/3/howto/argparse.html
Python学习教程:Python argparse模块_chen801090的博客-CSDN博客
https://blog.csdn.net/chen801090/article/details/102686939
argparse简要用法总结 | Yunfeng’s Simple Blog
https://vra.github.io/2017/12/02/argparse-usage/
Python 超好用標準函式庫 argparse. part 2 在這裡 | by Dboy Liao | Medium
https://dboyliao.medium.com/python-%E8%B6%85%E5%A5%BD%E7%94%A8%E6%A8%99%E6%BA%96%E5%87%BD%E5%BC%8F%E5%BA%AB-argparse-4eab2e9dcc69
argparse模塊用法實例詳解 - 知乎
https://zhuanlan.zhihu.com/p/56922793

其它相關文章推薦
Python 新手入門教學懶人包
Python 讀取 txt 文字檔
Python 寫檔,寫入 txt 文字檔
Python 讀取 csv 檔案
Python 寫入 csv 檔案
Python 讀寫檔案
Python 產生 random 隨機不重複的數字 list
Python PyAutoGUI 使用教學
Python OpenCV resize 圖片縮放