2016-09-28 24 views
6

argparse moduleを使用してPythonプログラムを作成していますが、プログラムで1つの引数または2つの引数を取ることを許可します。可変長引数

どういう意味ですか?さて、私はMMSメッセージをダウンロード/デコードするプログラムを作成しています。ユーザーは電話番号とMMS-Transaction-IDを提供して、データをダウンロードしたり、既にダウンロードしたMMSデータのシステムからファイルを提供することができます。

私がしたいことは、あなたが2つの引数に入力するか、または1つの引数するか、このようなものです:

./mms.py (phone mmsid | file) 

注:phoneは(15555555555のような)の電話番号となり、mmsid文字列( MMS-Transaction-ID)とfileをユーザーのコンピュータ上のファイル

​​でこれは可能ですか?私はadd_mutually_exclusive_groupを使うことを望んでいましたが、それは私がしたいことをしていないようでした。

parser = argparse.ArgumentParser() 
group = parser.add_mutually_exclusive_group(required=True) 
group.add_argument('phone', help='Phone number') 
group.add_argument('mmsid', help='MMS-Transaction-ID to download') 
group.add_argument('file', help='MMS binary file to read') 

これは(required=Trueを削除すると、同じエラーになります)エラーを与える:

ValueError: mutually exclusive arguments must be optional

それは私がphoneの代わりに--phoneを使用したいように見えます:

parser = argparse.ArgumentParser() 
group = parser.add_mutually_exclusive_group(required=True) 
group.add_argument('--phone', help='Phone number') 
group.add_argument('--mmsid', help='MMS-Transaction-ID to download') 
group.add_argument('--file', help='MMS binary file to read') 

私を実行している場合議論のないプログラム、私は参照してください:

error: one of the arguments --phone --mmsid --file is required

これは私が望むものに近いですが、私は​​を(--phone --msid) or (--file)とすることができますか?

+1

[サブコマンド](https://docs.python.org/2/library/argparse.html#sub-commands)を使用できますか? – mgilson

+0

@mgilson:私はそれを見ていませんでした。 「デフォルト」のコマンドを作成する方法はありますか? './mms.py decode file.bin'の代わりに' ./mms.py file.bin'や './mms.py download 15555555555 abcd'の代わりに' ./mms.py 15555555555 abcd'のようにします。 –

+0

それは良い質問です。 -/... – mgilson

答えて

4

これは、​​が実行できる範囲を少し超えています。最初の引数の「型」が事前にわかっていないためです。私はargs.file_or_phoneは、ファイル名や電話番号として意図されているかどうかを判断するには

import argparse 

p = argparse.ArgumentParser() 
p.add_argument("file_or_phone", help="MMS File or phone number") 
p.add_argument ("mmsid", nargs="?", help="MMS-Transaction-ID") 

args = p.parse_args() 

ような何かをするだろう、あなたはargs.mmsidNoneであるかどうかをチェックする必要があります。

+0

これは多かれ少なかれ、まさに私がやろうとしていたようです。私の 'file'引数には、' type = argparse.FileType( 'rb') 'がありました。私は手動で 'open(args.file_or_phone、 'rb')'を必要に応じて呼び出さなければならないと思います。 –

+0

また、 './mms.py(phone mmsid | file)'を表示するように表示されたテキストを上書きすることができます(そして、単にmmsidに "電話番号のみ"を追加する)ようにして、必要に応じて引数を処理します。 –

+1

与えられた値に基づいて、それが電話番号かファイル名かを判断し、それに応じて動作するカスタムアクションを定義することができます。しかし、引数自体は 'p.add_argument(" file_or_phone "、action = MyCustomAction、help =" ... ")'のようなものです。 – chepner

関連する問題