私はPython 2.7を使用しており、argparseを使用してシェルのような動作を実現しようとしています。 私の問題は、Python 2.7では、argparseのサブパーザをオプションとして使用する方法を見つけることができないということです。 私の問題を説明するのは難しいですから、私のプログラムから必要なものを説明します。Python 2.7でArgparseモジュールを使用してデフォルトサブパーザを設定する方法
プログラムは仕事の2つのモードがあります:指定されたコマンドとプログラム(各コマンドはそれ自身の 追加の引数を持っている)と追加の引数を開始
- は、特定の タスクを実行します。
- コマンドを使わないでプログラムを起動すると、シェルのようなプログラムが起動します。このプログラムは、引数の行をとり、与えられた行を引数として プログラムが呼び出されたかのように処理します。だから、
例えば私のプログラムは、 'CMD1' と 'CMD2' コマンドをサポートしている場合、私はそうのようにそれを使用することができます。
python program.py cmd1 additional_args1
python program.py cmd2 additional_args2
またはシェルとモード:
- また
cmd1 additional_args1
cmd2 additional_args2
quit
、私はまた、私のプログラムは、すべてのコマンドに影響しますオプションのグローバル引数を取ることができるようにしたいです。そのために
私は(これは純粋な例である)ので、同じようargparse使用しています:
parser = argparse.ArgumentParser(description="{} - Version {}".format(PROGRAM_NAME, PROGRAM_VERSION))
parser.add_argument("-i", "--info", help="Display more information")
subparsers = parser.add_subparsers()
parserCmd1 = subparsers.add_parser("cmd1", help="First Command")
parserCmd1.set_defaults(func=cmd1)
parserCmd2 = subparsers.add_parser("cmd2", help="Second Command")
parserCmd2.add_argument("-o", "--output", help="Redirect Output")
parserCmd2.set_defaults(func=cmd2)
だから私は(または-oフラグなし)(なし、追加の引数を持つ)CMD1またはCMD2を呼び出すことができます。両方の場合、呼び出されたコマンドのさらに多くの情報を表示するためにフラグ-iを追加することができます。
私は、引数としてCMD1またはCMD2を提供する必要があるため私の問題は、(理由は必須ですsubparsersを使用する)、私はシェルモードを有効にすることができないことを
制限事項です:私は、Pythonを使用することはできません
- 3(簡単にそこで実行できることはわかっています)
- グローバルなオプション引数のため、引数の解析をスキップする引数がないかどうかを確認することはできません。
- 私はそれが、どのように私はargparseとPython 2.7でのこのような行為を達成することができ、すべての
で何のコマンドを提供していないしなければならない場合、シェルを呼び出すための新しいコマンドを追加したくありませんか?
だけで簡単なメモ - subparsersがオプションであるという事実は、バグです。彼らは必要とされていましたが(通常のポジションと同じですが)、数年前の無関係の変更では、サブパーザーがクラックを通過しました。 – hpaulj