標準入力を取るオプションの引数を指定しようとしています。これは主に私のプログラムでデータをパイプするために使用されるので、someprog that outputs | python my_prog
.
私はargparseのドキュメントに従いました.Stackoverflowでこれに関する多くの質問/回答を読みましたが、どれもうまくいかないようです.
これが私がもともと持っているものです:
parser = argparse.ArgumentParser(description='Upgrade Instance.')
parser.add_argument('--app', '-a', dest='app', action='store', required=True)
parser.add_argument('--version', '-v', dest='version', action='store', default='', required=False)
parser.add_argument('--config', '-c', dest='config', action='store', default = '', required=False)
args = parser.parse_args()
ここでやりたいことは、ユーザーがversion
パイプを渡すのではなく、パイプを使用して渡すことを許可することです。
一番上に追加parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
しましたが、それは位置引数になります。そんなことがあるものか?nargs=?
オプションにすると思いました。
オプションの引数にする必要があります。だから私はそれを次のように変更しました:
parser.add_argument('--infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
これによりオプションの引数になりますが、パイプが渡されない場合、プログラムは stdin をデフォルトとして待機してハングします。を削除default=sys.stdin
してプログラムに何かをパイプすると、次のようになります。
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
それを実行するとき。を印刷するとargs
、次のようになりますNamespace(app='app', config='', g=False, hosts='03.app', infile=None, version='')
。
私がやっていることは非常に単純で一般的なようで、多くの人がそれについて尋ねてきました。しかし、それは私とはうまくいかないようです。
どうすればそれを機能させることができるかについて何か提案はありますか?