4

引数と位置引数で python-argparse を使用したい。コマンドラインにスクリプトがあるとします(これは単純で愚かな例です)、これまでのコードは次のとおりです。

#!/usr/bin/env python
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--verbose', action='store_true')
subparsers = parser.add_subparsers(help='command', dest='command')
cmd1_parser = subparsers.add_parser('command1')
cmd1_parser.add_argument('--verbose', action='store_true')

args = parser.parse_args()

print args

このスクリプトを次のように呼び出します。

~ $ myscript --verbose command1 --verbose
Namespace(command='command1', verbose=True)

~ $ myscript command1 --verbose
Namespace(command='command1', verbose=True)

~ $ myscript --verbose command1
Namespace(command='command1', verbose=True)

ご覧のとおり、常に同じ名前空間オブジェクトを取得し、詳細コマンドが通常のパラメーターなのかサブパーサー パラメーターなのかを区別できません。しかし、これらのパラメーターを個別に処理するにはそれが必要です。それを行うための簡単な方法 (最小限のコード作業で) は何でしょうか?

編集

Python stdlib イシュー トラッカー内にイシューを提出しました: http://bugs.python.org/issue15327

4

2 に答える 2

5

サブパーサーの add_argument 呼び出しを次のように変更します。

cmd1_parser.add_argument('--verbose', action='store_true', dest='cmd1_verbose')

これにより、最初の例が返されます。

~ $ myscript --verbose command1 --verbose
Namespace(cmd1_verbose=True, command='command1', verbose=True)
于 2012-04-12T21:42:58.097 に答える
4

ここに私が一緒にハックした小さなものがあります。バグがないわけではないことはほぼ保証しますが、この簡単なテストでは機能しました。

import argparse

class _Action(object):
    def __init__(self,master):
        self.master=master
    def add_parser(self,name,**kwargs):
        self.master.subparsers[name]=subParserEnabler()
        return self.master.subparsers[name]

class subParserEnabler(argparse.ArgumentParser):
    def __init__(self,*args,**kwargs):
        self.subparsers={}
        argparse.ArgumentParser.__init__(self,*args,**kwargs)

    def add_subparsers(self,**kwargs):
        return _Action(self)

    def parse_args(self,args,**kwargs):
        args=list(args)
        for k in self.subparsers.keys():
            if k in args:
                break
        try: 
            i=args.index(k)
            output=argparse.ArgumentParser.parse_args(self,args[:i],**kwargs)
            o1=argparse.Namespace()
            setattr(output,k,o1)
            self.subparsers[k].parse_args(args[i+1:],namespace=o1)
        except:
            output=argparse.ArgumentParser.parse_args(self,args,**kwargs)
        return output

parser = subParserEnabler()
parser.add_argument('--verbose', action='store_true')
subparsers = parser.add_subparsers(help='command',dest='command')
cmd1_parser = subparsers.add_parser('command1')
cmd1_parser.add_argument('--verbose', action='store_false')

args = parser.parse_args("--verbose command1 --verbose".split())
print args

まだエイリアスが不足しており、ヘルプの書式設定がおそらく間違っています...しかし、少なくとも私が望んでいた出力が提供されます. 最終的には、John Gaines Jr の答えはおそらく私の答えよりもはるかに単純です。

于 2012-04-12T22:54:33.113 に答える