私は自分のプロジェクト用にシェルを作成しています。これは、設計上、次のようなコマンドを解析します。
COMMAND_NAME ARG1="長い値" ARG2=123 ARG3=me@me.com
私の問題は、Python のコマンド ライン解析ライブラリ (getopt および optparse) により、引数の前に「-」または「--」を使用する必要があることです。この動作は私の要件と一致しません。
これをどのように解決できますか?このための既存のライブラリはありますか?
私は自分のプロジェクト用にシェルを作成しています。これは、設計上、次のようなコマンドを解析します。
COMMAND_NAME ARG1="長い値" ARG2=123 ARG3=me@me.com
私の問題は、Python のコマンド ライン解析ライブラリ (getopt および optparse) により、引数の前に「-」または「--」を使用する必要があることです。この動作は私の要件と一致しません。
これをどのように解決できますか?このための既存のライブラリはありますか?
引用符で囲まれた値を処理できる shlex.split() を使用してそれらを分割し、非常に単純な正規表現でこれを非常に簡単に解析できます。または、分割と解析の両方に正規表現を使用することもできます。または単に split() を使用します。
args = {}
for arg in shlex.split(cmdln_args):
key, value = arg.split('=', 1)
args[key] = value
「コマンドラインインターフェースの標準」に従うようにしてください
引数を (トーマスが提案したように) OptionParser 形式に変換します。
parser.parse_args(["--"+p if "=" in p else p for p in sys.argv[1:]])
コマンドライン引数が sys.argv または同様のリストになく、文字列にある場合 (ironfroggy が提案したように) を使用しますshlex.split()
。
parser.parse_args(["--"+p if "=" in p else p for p in shlex.split(argsline)])
Ironforggy のシュレックスの答えの小さな pythonic バリエーション:
args = dict( arg.split('=', 1) for arg in shlex.split(cmdln_args) )
おっと... -修正しました。
ありがとう、JF Sebastian (これらの単一引数ジェネレータ式を覚えておく必要があります)。
optmatch ( http://www.coderazzi.net/python/optmatch/index.htm ) はどうですか? 標準ではありませんが、オプションの解析に異なるアプローチを採用しており、任意のプレフィックスをサポートしています。
OptionMatcher.setMode(optionPrefix='-')
コマンドライン引数の処理をさらに簡単にするために私が書いた小さなPythonモジュールに興味があるかもしれません(オープンソースで無料で使用できます)-http://freshmeat.net/projects/commando
optparseまたはgetoptのかなり集中的な手術がなければ、あなたがそれらにあなたのフォーマットを解析させることが賢明にできるとは思いません。ただし、独自の形式を簡単に解析することも、optparseが処理できるものに変換することもできます。
parser = optparse.OptionParser()
parser.add_option("--ARG1", dest="arg1", help="....")
parser.add_option(...)
...
newargs = sys.argv[:1]
for idx, arg in enumerate(sys.argv[1:])
parts = arg.split('=', 1)
if len(parts) < 2:
# End of options, don't translate the rest.
newargs.extend(sys.argv[idx+1:])
break
argname, argvalue = parts
newargs.extend(["--%s" % argname, argvalue])
parser.parse_args(newargs)
パーティーには少し遅れました... しかし、PEP 389はこれとそれ以上のことを可能にします。
お使いのバージョンの Python で必要な場合に備えて、ちょっとした素敵なライブラリを次に示します code.google.com/p/argparse
楽しみ。