web-dev-qa-db-ja.com

単純なargparseの例が欲しかった:1引数、3結果

ドキュメンテーションargparse pythonモジュール は、すばらしいですが、私の小さな初心者の頭脳が今把握するには多すぎます。コマンドラインで数学を実行したり、画面上の書式設定ラインを変更したり、オプション文字を変更したりする必要はありません。 "argがAの場合はこれを行い、Bがそれを行う場合は上記のいずれもヘルプを表示せず終了した場合"

480
matt wilkie

元の質問に対する私の理解は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

もっと洗練された解決策があるかもしれませんが、これはうまくいき最小のものです。

222
mightypile

これが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つだけ追加してください。

328
Diego Navarro

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は引数名をキーとして、その値を値として持つ辞書を返します。

他にもたくさんのオプションやできることがありますが、これは最も重要な一般的な使用シナリオをカバーするはずです。

194
DMH

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
55
Mark E. Haase

この記事に触発された、まだ別の要約の紹介

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--helpが使用されている場合のこの引数の説明。
  • default :引数が省略された場合のデフォルト値。
  • typefloatまたはintが必要な場合(そうでない場合はstr)。
  • dest :フラグに別の名前を付けます(例:'-x', '--long-name', dest='longName')。
    注:デフォルトで--long-nameargs.long_nameでアクセスされます
  • action :特定の引数を特別に扱うためのもの
    • 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']
  • required :フラグが必要な場合、または位置引数が必要ない場合。
  • nargs :N個の引数を取り込むためのフラグ
    ./myscript.py --foo a b => args.foo = ['a', 'b']
  • 選択 :可能な入力を制限します(文字列のリストとして、またはtype=intの場合はintとして指定します)。
12
Sheljohn

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)
10
Alexey

これが私の学習プロジェクトで思いついたものです。主に@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

10
Peter L

placargparseのラッパー)を使うこともできます。

ボーナスとしてそれはきちんとしたヘルプ指示を生み出します - 下記を見てください。

スクリプト例:

#!/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
  • 引数の型 - 'flag'、 'option'、 'position'のいずれか(positional
  • 省略形(None
  • 引数値のタイプ - 例えば。 float、string(None
  • 制限のある選択肢のセット(['A', 'B']

ドキュメンテーション:

plac の使い方についてもっと学ぶためには、素晴らしいドキュメントをチェックしてください。

Plac:コマンドラインを簡単に解析する

4
quasoft

他の人が述べたことに追加するには:

私は通常 '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!"
3
Sandy Chapman

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
1
Hutch