1. ホーム
  2. python

[解決済み] Pythonのargparseで同じオプションを複数回使用する

2022-10-04 19:05:02

質問

複数の入力ソースを受け取り、それぞれに対して何かを行うスクリプトを書こうとしています。次のようなものです。

./my_script.py \
    -i input1_url input1_name input1_other_var \
    -i input2_url input2_name input2_other_var \
    -i input3_url input3_name
# notice inputX_other_var is optional

を使う方法がよくわかりません。 argparse . それは、各オプションフラグが一度だけ使用できるように設定されているようです。複数の引数を一つのオプションに関連付ける方法は知っているのですが ( nargs='*' または nargs='+' を使用することはできませんが、その場合でも -i フラグを複数回使用することはできません。これを達成するにはどうすればよいのでしょうか?

はっきりさせておきたいのですが、最終的に私が欲しいのは文字列のリストのリストです。ですから

[["input1_url", "input1_name", "input1_other"],
 ["input2_url", "input2_name", "input2_other"],
 ["input3_url", "input3_name"]]

どのように解決するのですか?

以下は、繰り返される 2 つの引数オプション - で定義された名前 - を処理するパーサーです。 metavar :

parser=argparse.ArgumentParser()
parser.add_argument('-i','--input',action='append',nargs=2,
    metavar=('url','name'),help='help:')

In [295]: parser.print_help()
usage: ipython2.7 [-h] [-i url name]

optional arguments:
  -h, --help            show this help message and exit
  -i url name, --input url name
                        help:

In [296]: parser.parse_args('-i one two -i three four'.split())
Out[296]: Namespace(input=[['one', 'two'], ['three', 'four']])

これは 2 or 3 argument のケースを扱うことはできません (しかし、私はこのような範囲を扱う Python のバグ/問題のために、少し前にパッチを書きました)。

で別の引数定義にするのはどうでしょう。 nargs=3metavar=('url','name','other') ?

タプルの metavar はまた nargs='+'nargs='*' という2つの文字列があります。 [-u A [B ...]] または [-u [A [B ...]]] .