[解決済み] argparseでコマンドラインの引数としてリストを渡すにはどうしたらいいですか?
2022-03-15 11:47:40
質問
コマンドライン・プログラムの引数として、リストを渡そうとしています。このような場合
argparse
オプションとしてリストを渡すことができますか?
parser.add_argument('-l', '--list',
type=list, action='store',
dest='list',
help='<Required> Set flag',
required=True)
スクリプトは以下のように呼び出されます。
python test.py -l "265340 268738 270774 270817"
解決方法は?
ショートアンサー
を使用します。
nargs
オプション、または
'append'
の設定は
action
オプションを使用します (ユーザーインターフェイスをどのように動作させたいかによって異なります)。
ナルグ
parser.add_argument('-l','--list', nargs='+', help='<Required> Set flag', required=True)
# Use like:
# python arg.py -l 1234 2345 3456 4567
nargs='+'
は1つ以上の引数を取ります。
nargs='*'
はゼロまたはそれ以上を取ります。
アペンド
parser.add_argument('-l','--list', action='append', help='<Required> Set flag', required=True)
# Use like:
# python arg.py -l 1234 -l 2345 -l 3456 -l 4567
と
append
を複数回指定することで、リストを構築することができます。
を使用しないでください。
type=list
!!!
- を使いたい場面はおそらくないでしょう。
type=list
と
argparse
. 今まで
ロングアンサー
では、その方法と結果について、もう少し詳しく見てみましょう。
import argparse
parser = argparse.ArgumentParser()
# By default it will fail with multiple arguments.
parser.add_argument('--default')
# Telling the type to be a list will also fail for multiple arguments,
# but give incorrect results for a single argument.
parser.add_argument('--list-type', type=list)
# This will allow you to provide multiple arguments, but you will get
# a list of lists which is not desired.
parser.add_argument('--list-type-nargs', type=list, nargs='+')
# This is the correct way to handle accepting multiple arguments.
# '+' == 1 or more.
# '*' == 0 or more.
# '?' == 0 or 1.
# An int is an explicit number of arguments to accept.
parser.add_argument('--nargs', nargs='+')
# To make the input integers
parser.add_argument('--nargs-int-type', nargs='+', type=int)
# An alternate way to accept multiple inputs, but you must
# provide the flag once per input. Of course, you can use
# type=int here if you want.
parser.add_argument('--append-action', action='append')
# To show the results of the given option to screen.
for _, value in parser.parse_args()._get_kwargs():
if value is not None:
print(value)
以下は、期待できる出力です。
$ python arg.py --default 1234 2345 3456 4567
...
arg.py: error: unrecognized arguments: 2345 3456 4567
$ python arg.py --list-type 1234 2345 3456 4567
...
arg.py: error: unrecognized arguments: 2345 3456 4567
$ # Quotes won't help here...
$ python arg.py --list-type "1234 2345 3456 4567"
['1', '2', '3', '4', ' ', '2', '3', '4', '5', ' ', '3', '4', '5', '6', ' ', '4', '5', '6', '7']
$ python arg.py --list-type-nargs 1234 2345 3456 4567
[['1', '2', '3', '4'], ['2', '3', '4', '5'], ['3', '4', '5', '6'], ['4', '5', '6', '7']]
$ python arg.py --nargs 1234 2345 3456 4567
['1234', '2345', '3456', '4567']
$ python arg.py --nargs-int-type 1234 2345 3456 4567
[1234, 2345, 3456, 4567]
$ # Negative numbers are handled perfectly fine out of the box.
$ python arg.py --nargs-int-type -1234 2345 -3456 4567
[-1234, 2345, -3456, 4567]
$ python arg.py --append-action 1234 --append-action 2345 --append-action 3456 --append-action 4567
['1234', '2345', '3456', '4567']
テイクアウェイ :
-
使用方法
nargs
またはaction='append'
-
nargs
は、ユーザーから見るとより分かりやすいのですが、位置引数がある場合はargparse
は、何が位置引数で、何がnargs
もし、位置引数がある場合はaction='append'
の方が良い結果になるかもしれません。 -
上記は、以下の場合にのみ当てはまります。
nargs
が与えられると'*'
,'+'
または'?'
. 整数を指定する場合 (4
とのオプションの混在は問題ありません。nargs
と位置引数で構成されているためargparse
は、そのオプションに期待される値の数を正確に把握することができます。
-
- コマンドラインで引用符を使用しない 1
-
を使用しないでください。
type=list
のリストを返すからです。-
このようなことが起こるのは、ボンネットの中で
argparse
の値を使用します。type
を強制するために 個々の与えられた引数 あなたが選んだtype
すべての引数の集合体ではありません。 -
を使用することができます。
type=int
(あるいは何でも)int型(あるいは何でも)のリストを取得します。
-
このようなことが起こるのは、ボンネットの中で
1
: 一般的な意味ではなく... つまり、引用符を使って
にリストを渡します。
argparse
は、あなたが望むものではありません。
関連
-
opencvとpillowを用いた顔認証システム(デモあり)
-
[解決済み】「OverflowError: Python int too large to convert to C long" on windows but not mac
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] リストが空かどうかを確認するにはどうすればよいですか?
-
[解決済み] 変数を参照渡しする方法を教えてください。
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] コマンドライン引数の読み方・処理方法は?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
Python百行で韓服サークルの画像クロールを実現する
-
Python Pillow Image.save jpg画像圧縮問題
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】Pythonのcsv文字列を配列に変換する。