2016-11-11 6 views
1

私はいくつかの引数といくつかのstdinデータを使用するスクリプトを持っています。私が使用した引数をチェックするためのPython argparseで必要に応じてstdinを設定できますか?

argparse.ArgumentParser

それがどの標準入力データが与えられているかどうかを確認することは可能ですか?そのような何か:

parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin, required=True) 

が、この例では、このエラーを与える:

TypeError: 'required' is an invalid argument for positionals

答えて

1

いいえ、それは、コマンドライン、または標準入力に与えられる、あなたがそれを渡すどんなファイルから読み込むwont't。開いているファイルハンドルが得られます.1バイト/ charを消費することさえありません。

たとえば、data = args.infile.read()(たとえば、argsが解析の結果であると仮定する)のように、データを自分で読み込むだけです。

それが空である場合は、単純なif not data:で、テストすることができます...

しかし、あなたが特定の形式でデータを期待する場合、通常は、最高のは、単にそれを解析しようとすると、エラーが発生することがありますもしあなたが失敗すれば。空のデータは無効です(たとえばjson)。それは有効ですが、受け入れ可能な入力でなければなりません。

(エラーのためとして、requiredが唯一のいくつかのオプションが--options-oオプションについては、コマンドラインやない与えなければならないかどうかを伝えます。あなたはnargsで自分の番号を変更しない限りPositionalsが常に要求されています)。

0

The add_argument() method

required - Whether or not the command-line option may be omitted (optionals only).

ドキュメントからrequiredキーワードのみオプション(例えば、-f又は--foo)のためではない位置引数に使用されます。ただそれを取り出してください。解析されたとき

parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), 
    default=sys.stdin) 

infileは、いずれかの文字列またはsys.stdinファイルオブジェクトになります。そのファイルを読んでそこに何かがあるかどうかを調べる必要があります。読書は危険なことがあります...あなたは永遠にブロックすることができます。しかし、それは単にユーザーが指示に従わなかったことを意味します。

1

エラーは、required=Trueパラメータのためです。メッセージはあなたに何が間違っているかを伝えます。それは次のようになります。

parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin) 

「--infile」に反対し、あなたが位置引数を作成してきたように、このinfile「を呼び出す」とは。​​はそれが必要かどうかを決定します。 nargs='?'では必須ではありません。定義上は任意です(しかし、引数はoptionalsではありません)。コマンドラインで -

FileTypeタイプが(「」または)ファイルに名前を付けることができます。開いて(stdinはすでに開いています)、args.infile属性に割り当てます。それ以上は何もしません。

だから、パースした後、args.infileを使用すると、あなたが必要な読み(及び必要に応じて閉じた場合はstdinない)ことができ、このオープンファイルにアクセスすることができます。

これは、コードで使用するために開くファイルをユーザーに指定させる便利な方法です。これは、1つのファイルを読み込んで、何かを実行し、別のファイルに書き込む単純なスクリプトを対象としていました。

しかし、あなたが見ているのはstdinなので、このタイプの使用には何の意味もありません。 sys.stdinは常に読むことができます。パーサーにstdinを読み取らせる方法はありません。それはコマンドラインから来るsys.argvを解析します。

ファイルからコマンドライン文字列を読み取るようにパーサーに指示するプレフィックスファイル機能があります(@)。ファイルを解析し、値をsys.argvにつなぎます。​​文書を参照してください。

関連する問題