私は、CLI progの引数を処理するためにArgparserを使用しています。しかし、時間が経つと、私はそれを使うのは良い考えではないと思う。ここで問題が起こる。私は接頭辞文字なしでオプションを使いたい。いいえgitコミットまたはsvn moveのように。私は少し調べて、Argparseにadd_subparser()メソッドがあることを発見しました。私たちは私たちのFOO PROGを移入してみましょう:Argparserに接頭辞なしでオプションを設定する方法はありますか?
parser = argparse.ArgumentParser(prog='foo', usage='%(prog)s [options]')
subparsers = parser.add_subparsers(help='sub-command help')
parser_a = subparsers.add_parser('add', help='a help')
parser_a.add_argument('-ap', '--add-project',
nargs='*',
action='store',
help="Add project")
parser_d = subparsers.add_parser('del', help='a help')
parser_d.add_argument('-dp', '--delete-project',
nargs='*',
action='store',
help="Delete project")
args = parser.parser_args()
は今オプションと印刷args
名前空間(私が過去に全体のコードはなかった、あなたはポイントを得る)とのfooを実行してみましょう:
$ ./foo del
Namespace(delete_project=None)
$ ./foo add
Namespace(add_project=None)
ご覧のとおり、del
というオプションを実行すると、のadd_projectは変数args
に渡されません。それは私が
def main(args):
if args.delete_project:
...
if args.add_project:
...
のように私のmain()関数で「if節」を持っている場合、私は私が実行した場合、名前空間は、名前add_projectを持つ属性を持っていないことを、はAttributeError例外を取得します問題が発生します./foo del
。それ以外に、私はオプションdel
とadd
に引数を渡すことができません。また、prefix_charsに空の文字列を設定しましたが、それもうまくいきませんでした。
これを処理する方法は何ですか? argparseはgit、svnなどのオプションを作成することができますか?自分の関数を作成して、すべての引数を自分で処理すべきですか?
それは絶対にあります。OPは、ユーザーが呼び出さなかったサブパーザーで属性エラーを取得しています。実際に使用されているサブパーターを調べる方法を説明しました。 – Tobu
Bah、私の間違い、私は完全に 'subparser'を逃した。 @Nick Heh。 –
それは少し簡潔でした、私は説明を残しています。 – Tobu