Sitemap

python argparse 的介紹 (python 的引數)

Kiwi lee
8 min readApr 11, 2018

0. what is argparse

程式寫完後,若是我們想要修改裡面的變數,通常會直接去改程式裡面的值,很麻煩。因此若是有個變數可以告訴程式執行時的變數資訊,這會方便我們很多~ 這個在外面程式定義的變數,我們稱之為引數 Argument。而在 python 裡面要完成引數有兩種方式,一種是利用 sys.argv ,很簡單但變化性很低,而這裡要講的 argparse,則是相對彈性化,可以滿足絕大多數的需求。

1. 最基本的 object 起始 class argparse.ArgumentParser

import argparseparser = argparse.ArgumentParser()

1.1 一些不錯的參數

  • prog: 程式的名稱,預設是檔名
  • description: 描述程式的資訊,會在所有參數說明的前面
  • epilog: 描述程式的資訊,會在所有參數說明的後面

1.2 Example

程式碼為

parser = argparser.Argument(prog='PROG', description='Tutorial')
# 印出 help 的內容
parser.print_help()

結果是

usage: PROG [-h]Tutorialoptional arguments:
-h, --help show this help message and exit

2. 參數的加入 ArgumentParser.add_argument

parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help')
# 回傳變數的剖析
parser.parse_args()

2.1 一些常用的參數

  • name or flags: 參數的名稱,可以用縮寫,但全名要有。例如:--target, -t
  • default: 預設的參數值
  • type: 參數值的型態
  • required: 參數值是否必須
  • help: 參數的說明
  • dest: 當 parse_args() 剖析完後的參數屬性。若無指定此項,則為 name 的大寫全名

2.2 Example

程式碼如下,加入兩個參數需求,

# filename: test1.py
import argparse
def process_command():
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help')
parser.add_argument('--text', '-t', type=str, required=True, help='Text for program')
return parser.parse_args()if __name__ == '__main__':
args = process_command()
print(args.text)
  1. 輸入 python test1.py
usage: test1.py [-h] [--foo FOO] --text TEXT
test1.py: error: argument --text/-t is required
  • 這裡說明了這個程式需要有 text 這個參數的導入
  • 在 usage 那邊沒有用 [ ] 框起來的,代表這個參數是必須的
  1. 輸入 python test1.py --help
usage: test1.py [-h] [--foo FOO] --text TEXToptional arguments:
-h, --help show this help message and exit
--foo FOO foo help
--text TEXT, -t TEXT Text for program

這裡說明了有哪些參數及其詳細的說明

  1. 輸入 python test1.py --text 'hello world'
hello world

看到 hello world 代表我們成功的利用參數來變化我們的程式了~

2.2 進階參數

  • action: action_true, action_false 代表程式有此引數的話,對應的參數值會有 True/False 的不同
  • choices: 參數值被限定在這些可能
  • nargs: 此參數會有多個參數值(有很多種方式)

3. 團體的引數 ArgumentParser.add_argument_group(title=None, description=None)

parser = argparse.ArgumentParser()
group = parser.add_argument_group('group')
group.add_argument('--foo')

3.1 介紹

可以將相關的引數資訊結合在一起,將功能分開顯示更清楚。

3.2 Example

# coding: utf-8
# filename: test2.py
import argparse
def process_command():
parser = argparse.ArgumentParser()
g1 = parser.add_argument_group('ahq', '還我西門')
g1.add_argument('--ahq', action='store_true', default=False, help='Choose ahq')
g1.add_argument('--text1', '-t1', type=str, default='westdoor will be back', help='note for ahq')

g2 = parser.add_argument_group('jteam', '雷我Fo哥')
g2.add_argument('--jteam', action='store_true', default=False, help='Choose jteam')
g2.add_argument('--text2', '-t2', type=str, default='FoFo QQ', help='note for jteam')

return parser.parse_args()

if __name__ == '__main__':
args = process_command()
if args.ahq:
print(args.text1)
if args.jteam:
print(args.text2)

程式中加入了 action 的範例,及 group argument 的範例,我們可以先從輸入 python test2.py 來看變化

usage: test2.py [-h] [--ahq] [--text1 TEXT1] [--jteam] [--text2 TEXT2]optional arguments:
-h, --help show this help message and exit
ahq:
還我西門
--ahq Choose ahq
--text1 TEXT1, -t1 TEXT1
note for ahq
jteam:
雷我Fo哥
--jteam Choose jteam
--text2 TEXT2, -t2 TEXT2
note for jteam
  • usage 可看到我們設定具有 action 的值後方不會要求參數值
  • 可看到下面的引數說明分成兩類了
  • 兩類的內部引數名稱不可重複 現在輸入 python test2.py --ahq,會出現
westdoor will be back

輸入 python test2.py --jteam --ahq 會出現

westdoor will be back
FoFo QQ

4. 多選一的引數設定 ArgumentParser.add_mutually_exclusive_group

4.1 Example

範例code

# coding: utf-8
# filename: test3.py
import argparse
def process_command():
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('--ahq', action='store_true', default=False, help='Choose ahq')
group.add_argument('--jteam', action='store_true', default=False, help='Choose jteam')
return parser.parse_args()

if __name__ == '__main__': args = process_command()
print(args)

輸入 python test3.py --help 來查看 help 資訊,從usage可以看到兩項被放在同個引數下,只能二選一。

usage: test3.py [-h] [--ahq | --jteam]optional arguments:
-h, --help show this help message and exit
--ahq Choose ahq
--jteam Choose jteam

測試單一項 python test3.py --ahq,可看到 ahq 中選了阿

Namespace(ahq=True, jteam=False)

若是我們想要多選 python test3.py --ahq --jteam 時,會發現出現 error 了。告訴我們這兩項不能被擺在一起。

usage: test3.py [-h] [--ahq | --jteam]
test3.py: error: argument --jteam: not allowed with argument --ahq

4.2 注意事項

  • 不可以將前面的 add_argument_group 作為 add_mutually_exclusive_group 的多選,因為 mutual 這個函數只能接受單一項的引數

--

--

Kiwi lee
Kiwi lee

Written by Kiwi lee

Hi, I'm kiwi, Platform Engineer (SRE, DevOps). Python Engineer. Love art, books, longboard. https://kiwi-walk.com

No responses yet