2012-04-12 10 views
3

引数と位置引数を付けてpython-argparseを使いたいです。私はコマンドライン上で私のスクリプトを持っていると言う(だけのシンプルな&愚かな例である)、これはこれまでのところ私のコードです: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) 

今のように同じ名前空間オブジェクトを常に得ることができ、verboseコマンドが通常のパラメータであるかサブパラメータパラメータであるかを区別することはできません。 しかし、これらのパラメータを個別に処理する必要があります。 これを行うには簡単な方法(最小限のコード努力)が必要ですか?

EDIT

私は、Python STDLIB課題追跡内の問題を提起した:これはあなたの最初になります

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

http://bugs.python.org/issue15327

+0

サブクエリ:argparseの問題はどこに記録しますか? – ifischer

+1

標準ライブラリにありますので、バグはhttp://bugs.python.org/にあります。ただし、機能リクエストの場合は、python-listまたはpython-ideasを使用する必要があります。 http://docs.python.org/devguide/communication.htmlを参照してください。 –

+0

これは大きな問題だと思います。サブパーザーはネームスペース内のネームスペースを(必要に応じて)返す必要がありますが、明らかにそのようには機能しません。さらに、 'add_subparsers'のdestキーワードが実際に何かをしているのはちょっと驚きです。 (どこにも書かれていないようです) – mgilson

答えて

4
はこれにあなたのsubparserのadd_argumentコールを変更

返信の例:

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

これはあまりにも多くのコマンドライン引数をオーバーロードしていない限りうまくいきます。 – mgilson

+0

argparse-helpがCMD1_VERBOSEを出力しないように、add_argumentにmetavar-paramを追加しました。 'cmd1_parser.add_argument( ' - verbose'、action = 'store_true'、dest = 'cmd1_verbose'、metavar = 'VERBOSE' ) ' – ifischer

3

ここに私が一緒にハッキングした小さなものがあります。私はほとんどそれがバグフリーではないことを保証するだろうが、この簡単なテストで働いた。

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の答えはおそらく私の場合よりもずっと簡単です。

関連する問題