19

コンマで区切られた整数のリストを含む必須の位置引数を解析したいと思います。最初の整数の先頭にマイナス ('-') 記号が含まれている場合、argparse は次のように警告します。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('positional')
parser.add_argument('-t', '--test', action='store_true')
opts = parser.parse_args()
print opts

$ python example.py --test 1,2,3,4
Namespace(positional='1,2,3,4', test=True)

$ python example.py --test -1,2,3,4
usage: example.py [-h] [-t] positional
example.py: error: too few arguments

$ python example.py --test "-1,2,3,4"
usage: example.py [-h] [-t] positional
example.py: error: too few arguments

フラグ キャラクターとして以外のキャラクターを使用することを提案する人を見てきまし-たが、私はむしろそれを使用したくありません。--testと の両方を-1,2,3,4有効な引数として許可するように argparse を構成する別の方法はありますか?

4

2 に答える 2

30

--コマンドライン引数にa を挿入する必要があります。

$ python example.py --test -- -1,2,3,4
Namespace(positional='-1,2,3,4', test=True)

二重ダッシュは、argparse によるオプションのスイッチの検索を停止します。これは、コマンドライン ツールのこのユース ケースを正確に処理するための事実上の標準的な方法です。

于 2013-02-04T19:09:49.523 に答える
8

ドキュメントから:

parse_args() メソッドは、ユーザーが明らかに間違いを犯した場合はいつでもエラーを出そうとしますが、状況によっては本質的にあいまいです。たとえば、コマンドライン引数 -1 は、オプションを指定しようとしているか、位置引数を提供しようとしている可能性があります。parse_args() メソッドはここで注意が必要です: 位置引数は、負の数のように見え、パーサーに負の数のように見えるオプションがない場合にのみ - で始まることがあります:

は負の数のようには見えない-1,2,3,4ので、ほとんどの *nix システムのように「エスケープ」する必要があります。--

他の解決策はnargs、位置指定に使用し、数字をスペースで区切って渡すことです。

#test.py
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('positional', nargs='*') #'+' for one or more numbers

print parser.parse_args()

出力:

$ python test.py -1 2 3 -4 5 6
Namespace(positional=['-1', '2', '3', '-4', '5', '6'])

必要なものを取得する 3 つ目の方法は、parse_known_argsの代わりに使用することですparse_args。位置引数をパーサーに追加せず、代わりに手動で解析します。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--test', action='store_true')

parsed, args = parser.parse_known_args()
print parsed
print args

結果:

$ python test.py  --test -1,2,3,4                                            
Namespace(test=True)
['-1,2,3,4']    

これには、ヘルプ テキストの情報が少なくなるという欠点があります。

于 2013-02-04T19:11:19.787 に答える