コマンドライン引数の読み取り/処理方法
-
06-07-2019 - |
質問
私はもともとCプログラマです。私は多くのトリックと「ハック」を見てきました。多くの異なる引数を読みます。
Pythonプログラマーがこれを行うことができる方法のいくつかは何ですか?
関連
解決
標準ライブラリの標準ソリューションは、 argparse
( docsです。 ):
例を次に示します。
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
は(特に)サポートしています:
- 複数のオプションを任意の順序で。
- 短いオプションと長いオプション。
- デフォルト値。
- 使用法ヘルプメッセージの生成。
他のヒント
import sys
print("\n".join(sys.argv))
sys.argv
コマンドラインでスクリプトに渡されるすべての引数を含むリストです。
基本的に、
import sys
print(sys.argv[1:])
argparse の福音伝道を行ってみると、これらの理由..本質的に:
(リンクからコピー)
-
argparseモジュールは位置を処理できます およびオプションの引数、 optparseはオプションのみを処理できます 引数
-
argparseは約独断的ではありません あなたのコマンドラインインターフェース 次のようになります--fileのようなオプション または/ fileがサポートされています 必須オプション。 Optparseは拒否します これらの機能をサポートします 実用性よりも純度
-
argparseはさらに生成します 情報を含む使用メッセージ。 から決定されるコマンドラインの使用法 あなたの議論、およびヘルプメッセージ 位置とオプションの両方 引数。 optparseモジュール 独自の使用法を記述する必要があります 文字列、および表示する方法はありません 位置引数のヘルプ。
-
argparseは、 可変数を消費する コマンドライン引数、optparse の正確な数が必要です 引数(1、2、3など)が既知である 事前に
-
argparseは、以下のパーサーをサポートします サブコマンドにディスパッチしながら、 optparseには設定が必要です
allow_interspersed_args
および パーサーを手動でディスパッチします
そして私の個人的なお気に入り:
- argparseでは、型と
add_argument()
へのアクションパラメーター simpleで指定される callables、optparseが必要 クラス属性のハッキング 取得するSTORE_ACTIONS
またはCHECK_METHODS
適切な引数チェック
argparse
stdlibモジュール(&quot ; impovement" on stdlibの optparse
モジュール)。 argparseの紹介の例:
# script.py
import argparse
if __name__ == '__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
1つの方法は、 sys.argv
を使用することです。これにより、スクリプト名が最初の引数として渡され、他のすべてのパラメーターが渡されます。
import sys
for arg in sys.argv:
print arg
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 __name__ == '__main__':
arguments = docopt(__doc__, version='Naval Fate 2.0')
print(arguments)
高速で柔軟性に欠ける何かが必要な場合
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
次の出力を生成します:
ハロージェームズスミス
#set default args as -h , if no args:
if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
私は自分でoptparseを使用していますが、サイモン・ウィリソンが最近紹介した optfunc ライブラリ。動作:
&quot;関数のイントロスペクション 定義(その引数を含む およびそのデフォルト値)および使用 コマンドラインを構築すること 引数パーサー。&quot;
たとえば、この関数定義:
def geocode(s, api_key='', geocoder='google', list_geocoders=False):
はこの最適化されたヘルプテキストになります:
Options:
-h, --help show this help message and exit
-l, --list-geocoders
-a API_KEY, --api-key=API_KEY
-g GEOCODER, --geocoder=GEOCODER
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」を暗黙的にする)。
コマンドライン引数の処理をさらに簡単にするために書いた小さなPythonモジュールに興味があるかもしれません(オープンソースで自由に使用できます)-コマンドー
これらの単純な代替手段として、 docopt を参照することをお勧めします。
docoptは、すべてを自分で実装することを要求するのではなく、-help使用法メッセージを解析することで機能する新しいプロジェクトです。使用法メッセージをPOSIX形式で入力するだけです。
さらに別のオプションは 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 __name__ == '__main__':
parser.dispatch()
ヘルプなどを自動的に生成します。デコレータを使用して、arg-parseingの動作に関する追加のガイダンスを提供できます。
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
私の解決策は、 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