2013-06-18 7 views
5

argparseを使用して任意の文字列をオプションの引数として定義するにはどうすればよいですか?python - argparseを使用して、任意の文字列を引数として渡します。

例:

[[email protected]]$ ./script.py FOOBAR -a -b 
Running "script.py"... 
You set the option "-a" 
You set the option "-b" 
You passed the string "FOOBAR" 

理想的には、私は問題ではありませに対する引数の位置をしたいと思います。すなわち:getoptsを使用している間

./script.py -a FOOBAR -b == ./script.py -a -b FOOBAR == ./script.py FOOBAR -a -b


BASHでは、私はこれを達成することができます。ケースループ内のすべての必要なスイッチを処理した後、私はshift $((OPTIND-1))を読み込む行を持っているだろうし、そこから私は標準$1を使用して、残りのすべての引数にアクセスすることができ、$2$3、等...
はそのような何かをexisit argparseのために?

+3

argparseチュートリアルを終了しましたか?あなたが記述しているものはすべてそこにあります – SheetJS

+0

議論されていない唯一の部分は 'nargs =" * "'の振る舞いです(1つの位置引数が残りの引数をすべて取得できるようになります) – SheetJS

+1

@Nirk、難しいのは、 'parse_args'は、「位置」引数を見るとすぐに、他の引数の検索をやめ、その位置引数から最後まで引き数を集めます。ほとんどの場合、これは問題ありませんが、彼の1番目と3番目の例が壊れてしまいます。 – jedwards

答えて

6

は、あなたが探しているものを正確に取得するには、トリックはparse_known_args()の代わりparse_args()を使用することです:

#!/bin/env python 

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('-a', action="store_true") 
parser.add_argument('-b', action="store_true") 

opts = parser.parse_known_args() 
# Print info about flags 
if opts[0].a: print('You set the option "-a"') 
if opts[0].b: print('You set the option "-b"') 
# Collect remainder (opts[1] is a list (possibly empty) of all remaining args) 
if opts[1]: print('You passed the strings %s' % opts[1]) 

EDIT:

 
./clargs.py -h 

usage: clargs_old.py [-h] [-a] [-b] 

optional arguments: 
    -h, --help show this help message and exit 
    -a 
    -b 

上記のコードは、次のヘルプ情報を表示します

オプションの任意の引数についてユーザーに通知する場合は、私が考えることができる唯一の解決策はArgumentParserをサブクラス化することですあなた自身でそれを書いてください。例えば

次のヘルプ情報を表示する

#!/bin/env python 

import os 
import argparse 

class MyParser(argparse.ArgumentParser): 
    def format_help(self): 
     help = super(MyParser, self).format_help() 
     helplines = help.splitlines() 
     helplines[0] += ' [FOO]' 
     helplines.append(' FOO   some description of FOO') 
     helplines.append('') # Just a trick to force a linesep at the end 
     return os.linesep.join(helplines) 

parser = MyParser() 
parser.add_argument('-a', action="store_true") 
parser.add_argument('-b', action="store_true") 

opts = parser.parse_known_args() 
# Print info about flags 
if opts[0].a: print('You set the option "-a"') 
if opts[0].b: print('You set the option "-b"') 
# Collect remainder 
if opts[1]: print('You passed the strings %s' % opts[1]) 

 
./clargs.py -h 

usage: clargs.py [-h] [-a] [-b] [FOO] 

optional arguments: 
    -h, --help show this help message and exit 
    -a 
    -b 
    FOO   some description of FOO 

オプションの引数」の下に「利用」のラインとヘルプのFOO[FOO]の追加を注意してください"

+0

これは良いことですが、オプションの文字列のargparseからの組み込みのヘルプダイアログが失われてしまいます。 – svenglar

+1

これは本当です。私が考えることができる唯一の解決策は、ArgumentParserをサブクラス化し、それをあなた自身で書くことです。このフープを飛び越えなければならない唯一の理由は、引数の順序付けがうまくいくためです。私はArgumentParserのサブクラス化の例を使って答えを編集します。 – jedwards

+0

うわー、ありがとう!オプションの引数を任意の文字列にするというオプションはargparseにないというのは奇妙なようです。この回答をありがとうございます。 – svenglar

関連する問題