Skip to content

[Python] argparse 如何傳遞列表 (List) 當作程式參數

Last Updated on 2021-07-26 by Clay

在使用 Python 進行後端程式開發時,我們經常會使用 argparse 來準備 Python 程式的輸入參數,再使用終端機執行一個 Shell Script 將各個程式串接起來,就好像 Pipeline 一樣。就在今天我在準備做這件事情的時候,突然間發現:

現在,我需要傳遞一連串的資料比如 [1, 2, 3, 4, 5] ,但是,我卻不知道在 argparse 當中該如何傳遞資料。如果不管三七二十一,直接寫下下面這樣的 test.py

# coding: utf-8
import argparse


# Argument
parser = argparse.ArgumentParser()
parser.add_argument('--list_data', type=int)
args = parser.parse_args()


print('Results:', args.list_data)



然後我輸入以下這樣的指令:

python3 test.py --list_data 1 2 3 4 5


Output:

usage: test.py [-h] [--list_data LIST_DATA]
test.py: error: unrecognized arguments: 2 3 4 5

沒錯,一個參數設定,基本上只能對應一個參數!


傳遞列表 (List) 的方法

基本上,只要在 add_argument() 當中加入 nargs='+' 這樣的參數即可。不過仍然要小心,指定資料型態的 type 別設定成 list

以下是正確的示範:

# coding: utf-8
import argparse


# Argument
parser = argparse.ArgumentParser()
parser.add_argument('--list_data', type=int, nargs='+')
args = parser.parse_args()


print('Results:', args.list_data)



然後使用輸入以下指令:

python3 test.py --list_data 1 2 3 4 5

Output:

Results: [1, 2, 3, 4, 5]

反之,如果我們很順手地設定了 type=list 呢? ( ... 我一開始就這樣)

# coding: utf-8
import argparse


# Argument
parser = argparse.ArgumentParser()
parser.add_argument('--list_data', type=list, nargs='+')
args = parser.parse_args()


print('Results:', args.list_data)



然後輸入以下指令:

python3 test.py --list_data 1 2 3 4 5

Output:

Results: [['1'], ['2'], ['3'], ['4'], ['5']]

沒錯,列表中的所有元素也都成為 List 的資料型態了!我想這應該不是想要的結果。


References


Read More

Leave a Reply