私はもともとCプログラマーです。私は多くの異なる議論を読むための数多くのトリックと「ハッキング」を見てきました。
Pythonプログラマがこれを行う方法にはどのようなものがありますか?
私はもともと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
サポート(とりわけ):
optparse
は非推奨になっているため、質問の質問者はスタックオーバーフローのメンバーではなくなりました。これは、非常に目立つ質問に対する承認された回答argparse
です。代わりにstdlibを使用するようにサンプルコードを完全に書き直すことを検討してください。
import sys
print("\n".join(sys.argv))
sys.argv
コマンドラインでスクリプトに渡されるすべての引数を含むリストです。
基本的に、
import sys
print(sys.argv[1:])
sys.argv[1:]
(スクリプト名は避けてください)。
argparseの伝道を回るだけですが、これらの理由により本質的には優れています。
(リンクからコピー)
argparseモジュールは位置引数とオプション引数を処理できますが、optparseはオプション引数のみを処理できます
argparseは、コマンドラインインターフェイスがどのように見えるべきかについて独断的ではありません--fileや/ fileのようなオプションは、必要なオプションと同様にサポートされています。Optparseはこれらの機能のサポートを拒否し、実用性よりも純粋さを優先します
argparseは、引数から決定されたコマンドラインの使用法や、位置引数とオプション引数の両方のヘルプメッセージを含む、より有益な使用法メッセージを生成します。optparseモジュールはあなた自身の使用法の文字列を書くことを要求し、位置引数のヘルプを表示する方法がありません。
argparseは可変数のコマンドライン引数を消費するアクションをサポートしますが、optparseは引数の正確な数(1、2、または3など)を事前に知っている必要があります
argparseはサブコマンドにディスパッチするパーサーをサポートしていますが、optparseはallow_interspersed_args
パーサーディスパッチを手動で設定および実行する必要があります
そして私の個人的なお気に入り:
add_argument()
optparseは同様にクラス属性をハッキングが必要ですが、簡単な呼び出し可能オブジェクトで指定する
STORE_ACTIONS
か、CHECK_METHODS
適切な引数チェックを取得するには-f
やなどのオプションのような引数で指定された引数を意味しますが--foo
、「正確な数の引数は事前にわかっている」は、おそらく先行するオプションフラグなしで与えられた位置引数を意味します。
ありargparse
STDLIBモジュール(STDLIBさんの「impovement」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
docoptのライブラリは本当に滑りやすいです。アプリの使用法文字列から引数dictを構築します。
たとえば、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
次の出力を生成します。
こんにちはJames Smith
python main.py "James Smith"
を挿入James Smith
しsys.argv[1]
て生成するIndexError
ことですsys.argv[2]
。引用動作は、Pythonを実行するプラットフォームとシェルによって多少異なります。
python main.py "James Joseph Smith"
ますか?範囲外のインデックスに関心がある場合は、提供された引数の数のチェックを追加できます。あまり現実的ではないにせよ、私の例は複数の引数を処理する方法を示しています。
gmail-trash-msg.py MessageID
ます。この答えは簡単です。テストMessageID
パラメータが渡されましたsys.argv[1]
。
私は自分自身でoptparseを使用していますが、Simon Willisonが最近導入したoptfuncライブラリーで取っている方向が本当に好きです。それはによって働きます:
「関数の定義(引数とそのデフォルト値を含む)をイントロスペクトし、それを使用してコマンドライン引数パーサーを構築します。」
したがって、たとえば、次の関数定義は:
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
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」を暗黙的にする)。
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
コマンドライン引数の処理をさらに簡単にするために私が書いた小さなPythonモジュールに興味があるかもしれません(オープンソースで自由に使用できます)-Commando
私はこれらの他の単純な代替として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()
ヘルプなどを自動的に生成し、デコレータを使用して、引数の解析がどのように機能するかについて追加のガイダンスを提供できます。
argh
と、他のライブラリやを使用するよりも簡単ですsys
。
argh
が、サブコマンド付きのコマンドを持たないことが最大の目的であるシナリオには特に適していません。
def frobnicate_spleches(...)
スクリプトが実行することをすべて実行する関数を定義しif __name__ == '__main__': argh.dispatch_command(frobnicate_spleches)
、ファイルの最後で実行することは、完全に実行可能であるように思われます。
私の解決策は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