ドキュメンテーションargparse pythonモジュール は、すばらしいですが、私の小さな初心者の頭脳が今把握するには多すぎます。コマンドラインで数学を実行したり、画面上の書式設定ラインを変更したり、オプション文字を変更したりする必要はありません。 "argがAの場合はこれを行い、Bがそれを行う場合は上記のいずれもヘルプを表示せず終了した場合" 。
元の質問に対する私の理解は2つあります。まず、最も単純なargparseの例に関しては、ここで見たことがないことに驚きました。もちろん、簡単に言うと、それはすべてわずかな電力でオーバーヘッドになりますが、開始することになるかもしれません。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("a")
args = parser.parse_args()
if args.a == 'magic.name':
print 'You nailed it!'
しかし、この位置の議論は今必要とされています。このプログラムを起動するときにそれを省略すると、引数が足りないというエラーが発生します。これで私は最初の質問の第二部に入ります。 Matt Wilkieは、名前付きラベル( - オプションラベル)を付けずに、 オプションの 引数を1つだけ使用したいようです。私の提案は、上記のコードを次のように修正することです。
...
parser.add_argument("a", nargs='?', default="check_string_for_empty")
...
if args.a == 'check_string_for_empty':
print 'I can tell that no argument was given and I can deal with that here.'
Elif args.a == 'magic.name':
print 'You nailed it!'
else:
print args.a
もっと洗練された解決策があるかもしれませんが、これはうまくいき最小のものです。
これがargparse
(複数の引数)を使ったやり方です。
parser = argparse.ArgumentParser(description='Description of your program')
parser.add_argument('-f','--foo', help='Description for foo argument', required=True)
parser.add_argument('-b','--bar', help='Description for bar argument', required=True)
args = vars(parser.parse_args())
args
は引数を含む辞書です。
if args['foo'] == 'Hello':
# code here
if args['bar'] == 'World':
# code here
あなたの場合は、引数を1つだけ追加してください。
argparse
のドキュメントはかなり良いですが、明らかではないかもしれないいくつかの有用な詳細を省きます。 (@Diego Navarroはすでにこれについていくつか述べていますが、私は彼の答えを少し広げてみます。)基本的な使い方は次のとおりです。
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--my-foo', default='foobar')
parser.add_argument('-b', '--bar-value', default=3.14)
args = parser.parse_args()
parse_args()
から返されるオブジェクトは 'Namespace'オブジェクトです:メンバー変数があなたのコマンドライン引数にちなんで命名されるオブジェクトです。 Namespace
オブジェクトは、あなたの引数とそれに関連する値にアクセスする方法です。
args = parser.parse_args()
print args.my_foo
print args.bar_value
(変数に名前を付けるとき、argparse
は引数名の ' - 'をアンダースコアに置き換えます。)
多くの場合、引数を単に値をとらないフラグとして使用したいと思うかもしれません。これをargparseに追加することができます。
parser.add_argument('--foo', action='store_true')
parser.add_argument('--no-foo', action='store_false')
上記はそれぞれ、値がTrueの 'foo'、値がFalseの 'no_foo'という名前の変数を作成します。
if (args.foo):
print "foo is true"
if (args.no_foo is False):
print "nofoo is false"
引数を追加するときに "required"オプションを使用できることにも注意してください。
parser.add_argument('-o', '--output', required=True)
こうすれば、コマンドラインでこの引数を省略した場合、argparse
はその引数がないことを示し、スクリプトの実行を停止します。
最後に、vars
関数を使用して引数の辞書構造を作成することが可能であることに注意してください。
args = parser.parse_args()
argsdict = vars(args)
print argsdict['my_foo']
print argsdict['bar_value']
ご覧のとおり、vars
は引数名をキーとして、その値を値として持つ辞書を返します。
他にもたくさんのオプションやできることがありますが、これは最も重要な一般的な使用シナリオをカバーするはずです。
Mattはargparseの位置パラメータについて質問しています。Pythonのドキュメントではこの点が欠けていることに同意します。 構文解析と位置パラメータの使用 の両方を示す、奇妙な20ページ以内の単一の完全な例はありません。
ここにある他の答えのどれも、位置パラメータの完全な例を示していないので、完全な例です。
# tested with python 2.7.1
import argparse
parser = argparse.ArgumentParser(description="An argparse example")
parser.add_argument('action', help='The action to take (e.g. install, remove, etc.)')
parser.add_argument('foo-bar', help='Hyphens are cumbersome in positional arguments')
args = parser.parse_args()
if args.action == "install":
print("You asked for installation")
else:
print("You asked for something other than installation")
# The following do not work:
# print(args.foo-bar)
# print(args.foo_bar)
# But this works:
print(getattr(args, 'foo-bar'))
私を諦めたのは、argparseは名前付き引数 "--foo-bar"を "foo_bar"に変換しますが、 "foo-bar"という位置パラメータは "foo-bar"のままなので、以下のようにします。あなたのプログラムでそれを使ってください。
私の例の終わり近くにある2行に注意してください - どちらもfoo-bar位置パラメータの値を取得するのに機能しません。最初のものは明らかに間違っています(それは算術式args.fooからbarを引いたものです)、しかし2番目のものはどちらも動きません:
AttributeError: 'Namespace' object has no attribute 'foo_bar'
foo-bar
属性を使いたい場合は、私の例の最後の行にあるように、getattr
を使わなければなりません。 dest=foo_bar
を使用してプロパティ名をアクセスしやすいものに変更しようとすると、非常に奇妙なエラーメッセージが表示されます。
ValueError: dest supplied twice for positional argument
上記の例の実行方法は次のとおりです。
$ python test.py
usage: test.py [-h] action foo-bar
test.py: error: too few arguments
$ python test.py -h
usage: test.py [-h] action foo-bar
An argparse example
positional arguments:
action The action to take (e.g. install, remove, etc.)
foo-bar Hyphens are cumbersome in positional arguments
optional arguments:
-h, --help show this help message and exit
$ python test.py install foo
You asked for installation
foo
import argparse
# define functions, classes, etc.
# executes when your script is called from the command-line
if __== "__main__":
parser = argparse.ArgumentParser()
#
# define each option with: parser.add_argument
#
args = parser.parse_args() # automatically looks at sys.argv
#
# access results with: args.argumentName
#
引数は以下の組み合わせで定義されます。
parser.add_argument( 'name', options... ) # positional argument
parser.add_argument( '-x', options... ) # single-char flag
parser.add_argument( '-x', '--long-name', options... ) # flag with long name
一般的なオプションは次のとおりです。
--help
が使用されている場合のこの引数の説明。float
またはint
が必要な場合(そうでない場合はstr
)。'-x', '--long-name', dest='longName'
)。--long-name
はargs.long_name
でアクセスされますstore_true, store_false
: ブール引数の場合'--foo', action='store_true' => args.foo == True
store_const
: オプションconst
と一緒に使用'--foo', action='store_const', const=42 => args.foo == 42
count
: ./myscript.py -vv
のように繰り返しオプション'-v', action='count' => args.v == 2
append
: ./myscript.py --foo 1 --foo 2
のように繰り返しオプション'--foo', action='append' => args.foo == ['1', '2']
./myscript.py --foo a b => args.foo = ['a', 'b']
type=int
の場合はintとして指定します)。Python HOWTO /の Argparseチュートリアル に注意してください。これは、このような最も基本的な例から始まります。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
args = parser.parse_args()
print(args.square**2)
そしてそれほど基本的でないものへと進みます。
尋ねられたもののような、オプションのための事前定義された選択の例があります:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print("the square of {} equals {}".format(args.square, answer))
Elif args.verbosity == 1:
print("{}^2 == {}".format(args.square, answer))
else:
print(answer)
これが私の学習プロジェクトで思いついたものです。主に@DMHのおかげで...
デモコード:
import argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--flag', action='store_true', default=False) # can 'store_false' for no-xxx flags
parser.add_argument('-r', '--reqd', required=True)
parser.add_argument('-o', '--opt', default='fallback')
parser.add_argument('arg', nargs='*') # use '+' for 1 or more args (instead of 0 or more)
parsed = parser.parse_args()
# NOTE: args with '-' have it replaced with '_'
print('Result:', vars(parsed))
print('parsed.reqd:', parsed.reqd)
if __== "__main__":
main()
これは進化したかもしれず、オンラインで入手可能です: command-line.py
このコードを試してみるスクリプト: command-line-demo.sh
plac (argparse
のラッパー)を使うこともできます。
ボーナスとしてそれはきちんとしたヘルプ指示を生み出します - 下記を見てください。
#!/usr/bin/env python3
def main(
arg: ('Argument with two possible values', 'positional', None, None, ['A', 'B'])
):
"""General help for application"""
if arg == 'A':
print("Argument has value A")
Elif arg == 'B':
print("Argument has value B")
if __== '__main__':
import plac
plac.call(main)
引数は指定されていません - example.py
:
usage: example.py [-h] {A,B}
example.py: error: the following arguments are required: arg
予期しない引数が渡されました - example.py C
:
usage: example.py [-h] {A,B}
example.py: error: argument arg: invalid choice: 'C' (choose from 'A', 'B')
指定された正しい引数 - example.py A
:
Argument has value A
フルヘルプメニュー(自動的に生成されます) - example.py -h
:
usage: example.py [-h] {A,B}
General help for application
positional arguments:
{A,B} Argument with two possible values
optional arguments:
-h, --help show this help message and exit
引数の名前は通常、パラメータ名(arg
)と同じです。
arg
パラメーターの後のTupleアノテーションは以下の意味を持ちます。
Argument with two possible values
)positional
)None
)None
)['A', 'B']
)plac の使い方についてもっと学ぶためには、素晴らしいドキュメントをチェックしてください。
他の人が述べたことに追加するには:
私は通常 'dest'パラメータを使用して変数名を指定し、次に 'globals()。update()'を使用してそれらの変数をグローバル名前空間に入れるのが好きです。
使用法:
$ python script.py -i "Hello, World!"
コード:
...
parser.add_argument('-i', '--input', ..., dest='inputted_variable',...)
globals().update(vars(parser.parse_args()))
...
print(inputted_variable) # Prints "Hello, World!"
Argparseを使用して '-h'/'--help'スイッチを修正して独自の個人コードのヘルプ指示を表示する本当に簡単な方法は、デフォルトのヘルプをFalseに設定することです。また、必要な数の.add_argumentsを追加することもできます:
import argparse
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument('-h', '--help', action='help',
help='To run this script please provide two arguments')
parser.parse_args()
実行:python test.py -h
出力:
usage: test.py [-h]
optional arguments:
-h, --help To run this script please provide two arguments