webdevqa.jp.net

コマンドライン引数を読み/処理するにはどうすればいいですか?

540
edgerA

標準ライブラリの標準的な解決策はargparsedocs )です。

これが一例です。

from argparse import ArgumentParser

parser = ArgumentParser()
parser.add_argument("-f", "--file", dest="filename",
                    help="write report to FILE", metavar="FILE")
parser.add_argument("-q", "--quiet",
                    action="store_false", dest="verbose", default=True,
                    help="don't print status messages to stdout")

args = parser.parse_args()

argparseは(とりわけ)サポートしています。

  • 任意の順序で複数のオプション.
  • 短いオプションと長いオプション.
  • デフォルト値.
  • 使用法ヘルプメッセージの生成.
371
Ayman Hourieh
import sys

print("\n".join(sys.argv))

sys.argv は、コマンドラインでスクリプトに渡されたすべての引数を含むリストです。

基本的に、

import sys
print(sys.argv[1:])
488
John Slavick

argparseこれらの のための方がより良いです。

(リンクからコピー)

  • argparseモジュールは位置引数とオプション引数を処理できますが、optparseモジュールはオプション引数のみを処理できます。

  • argparseは、あなたのコマンドラインインターフェースがどうあるべきかについては教義的ではありません - 必須のオプションとして、-fileや/ fileのようなオプションがサポートされています。 Optparseはこれらの機能をサポートすることを拒否し、実用性よりも純粋さを好む

  • argparseは、引数から決定されたコマンドラインの使用法、位置引数とオプション引数の両方に関するヘルプメッセージなど、より有益な使用法メッセージを生成します。 optparseモジュールはあなたがあなた自身の用法文字列を書くことを必要とし、位置引数のヘルプを表示する方法がありません。

  • argparseは可変数のコマンドライン引数を消費するアクションをサポートしますが、optparseは正確な数の引数(例えば1、2、3)を事前に知っておく必要があります。

  • argparseはサブコマンドにディスパッチするパーサをサポートしますが、optparseはallow_interspersed_argsを設定して手動でパーサをディスパッチする必要があります。

そして私の個人的なお気に入り:

  • argparseは単純な呼び出し可能オブジェクトでtypeとactionパラメータをadd_argument()に指定することを可能にします、一方optparseは適切な引数チェックを得るためにSTORE_ACTIONSまたはCHECK_METHODSのようなクラス属性をハッキングすることを必要とします
125
Silfheed

argparse stdlibモジュール (stdlibのoptparseモジュールの「改善」)もあります。 argparseの紹介 の例:

# script.py
import argparse

if __== '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument(
        'integers', metavar='int', type=int, choices=range(10),
         nargs='+', help='an integer in the range 0..9')
    parser.add_argument(
        '--sum', dest='accumulate', action='store_const', const=sum,
        default=max, help='sum the integers (default: find the max)')

    args = parser.parse_args()
    print(args.accumulate(args.integers))

使用法:

$ script.py 1 2 3 4
4

$ script.py --sum 1 2 3 4
10
65
jfs

その1つの方法はsys.argvを使うことです。これにより、最初の引数としてスクリプト名が渡され、その他のすべてのパラメータが渡されます。

import sys

for arg in sys.argv:
    print arg
48
JPCosta

docopt ライブラリは本当に滑らかです。それはあなたのアプリの用法文字列から引数の辞書を構築します。

Docopt readmeからの例:

"""Naval Fate.

Usage:
  naval_fate.py ship new <name>...
  naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
  naval_fate.py ship shoot <x> <y>
  naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
  naval_fate.py (-h | --help)
  naval_fate.py --version

Options:
  -h --help     Show this screen.
  --version     Show version.
  --speed=<kn>  Speed in knots [default: 10].
  --moored      Moored (anchored) mine.
  --drifting    Drifting mine.

"""
from docopt import docopt


if __== '__main__':
    arguments = docopt(__doc__, version='Naval Fate 2.0')
    print(arguments)
46
ralbatross

あなたが速く何かを必要とし、あまり柔軟ではない場合

main.py:

import sys

first_name = sys.argv[1]
last_name = sys.argv[2]
print("Hello " + first_name + " " + last_name)

それからpython main.py James Smithを実行してください。

次のように出力します。

こんにちはジェームズスミス

37
#set default args as -h , if no args:
if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
24
whi

私は自分でoptparseを使っていますが、Simon Willisonが最近紹介した optfunc libraryで取っている方向と同じように思います。それは働きます:

msgstr "" "関数定義(その引数とそのデフォルト値を含む)をイントロスペクトしてそれを使ってコマンドライン引数パーサを構築します。"

それで、例えば、この関数定義は:

def geocode(s, api_key='', geocoder='google', list_geocoders=False):

このoptparseヘルプテキストに変わります:

    Options:
      -h, --help            show this help message and exit
      -l, --list-geocoders
      -a API_KEY, --api-key=API_KEY
      -g GEOCODER, --geocoder=GEOCODER
19
Van Gale

Stdlibのgetoptが好きです。例えば:

try:
    opts, args = getopt.getopt(sys.argv[1:], 'h', ['help'])
except getopt.GetoptError, err: 
    usage(err)

for opt, arg in opts:
    if opt in ('-h', '--help'): 
        usage()

if len(args) != 1:
    usage("specify thing...")

最近、私は物事をより冗長にするためにこれに似た何かをラップしています(例えば、「-h」を暗黙的にする)。

8
Peter Ericson

ご覧のように optparse "optparseモジュールは廃止予定で今後は開発されません。開発は argparse モジュールで続行されます。"

7
tverrbjelke

Pocooの click はより直感的で、必要な定型文が少なく、少なくともargparseと同じくらい強力です。

私がこれまでに遭遇した唯一の弱点は、ページを支援するためのカスタマイズがあまりできないということですが、通常はそれは要件ではなく、 docopt が明確な選択のようです。

7
Ryne Everett

あなたは私が書いた小さなPythonモジュールに興味があるかもしれません(オープンソースと自由に使える) - Commando

4
Mufasa

私は docopt をこれらの他のものへの単純な代替として見ることを勧めます。

docoptは、あなたが自分ですべてを実装することを要求するのではなく、あなたの--help使用法メッセージを解析することによって機能する新しいプロジェクトです。使用法メッセージをPOSIX形式にするだけです。

4
David C. Bishop
import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                   help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                   const=sum, default=max,
                   help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))

Assuming the Python code above is saved into a file called prog.py
$ python prog.py -h

Ref-link: https://docs.python.org/3.3/library/argparse.html
3
JON

さらに別の選択肢は argh です。それはargparseの上に構築されており、そしてあなたに次のようなことを書かせることができます:

import argh

# declaring:

def echo(text):
    "Returns given Word as is."
    return text

def greet(name, greeting='Hello'):
    "Greets the user with given name. The greeting is customizable."
    return greeting + ', ' + name

# assembling:

parser = argh.ArghParser()
parser.add_commands([echo, greet])

# dispatching:

if __== '__main__':
    parser.dispatch()

それは自動的にヘルプなどを生成するでしょう、そしてあなたは引数解析がどのように働くべきであるかに関する追加ガイダンスを提供するためにデコレータを使うことができます。

3
circular-ruin

私の解決策は entrypoint2 です。例:

from entrypoint2 import entrypoint
@entrypoint
def add(file, quiet=True): 
    ''' This function writes report.

    :param file: write report to FILE
    :param quiet: don't print status messages to stdout
    '''
    print file,quiet

ヘルプテキスト:

usage: report.py [-h] [-q] [--debug] file

This function writes report.

positional arguments:
  file         write report to FILE

optional arguments:
  -h, --help   show this help message and exit
  -q, --quiet  don't print status messages to stdout
  --debug      set logging level to DEBUG
0
ponty