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
- https://docs.python.org/3/library/argparse.html
- https://stackoverflow.com/questions/15753701/how-can-i-pass-a-list-as-a-command-line-argument-with-argparse
- https://www.kite.com/python/answers/how-to-pass-a-list-as-an-argument-using-argparse-in-python