Python argparse与stdin互斥,是选项之一 [英] Python argparse mutually exclusive with stdin being one of the options

查看:111
本文介绍了Python argparse与stdin互斥,是选项之一的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望我的脚本接收以下互斥的 input 选项:

I would like my script to receive these mutually exclusive input options:

  • 包含JSON(script.py -i input.json)的输入文件;
  • 包含JSON(script.py '{"a":1}')的字符串;
  • 来自stdin(echo '{"a":1}' | script.pycat input.json | script.py)的JSON.
  • an input file containing a JSON (script.py -i input.json);
  • a string containing a JSON (script.py '{"a":1}');
  • a JSON from stdin (echo '{"a":1}' | script.py or cat input.json | script.py).

和这些互斥的输出选项:

  • 包含JSON的输出文件;
  • 标准输出中的JSON.

所以我尝试了这段代码

import json,sys,argparse
parser = argparse.ArgumentParser(description='Template for python script managing JSON as input/output format')

group = parser.add_mutually_exclusive_group()
group.add_argument('--input-file', '-i',  type=str, help='Input file name containing a valid JSON.', default=sys.stdin)
group.add_argument('json',    nargs='?',  type=str, help='Input string containing a valid JSON.' , default=sys.stdin)
parser.add_argument('--output-file', '-o',type=str, help='Output file name.')

args = parser.parse_args()

if not sys.stdin.isatty():
    data = sys.stdin.read()
else:
#    args = parser.parse_args()
    if args.input_file :
        data=open(args.input_file).read()
    elif args.json :
        data=args.json


datain=json.loads(data)

dataout=json.dumps(datain, indent=2)

if args.output_file :
        output_file=open(args.output_file, 'w')
        output_file.write(dataout+'\n')
        output_file.close()
else:
    print (dataout)

但是它不适用于stdin,因为它至少需要两个group选项之一.

But it does not work with stdin as it requires at least one of the two group options.

如何在输入选项列表中添加标准输入?

How can I add stdin in the list of input options?

如果我这样称呼的话,添加default=sys.stdin参数是可行的

Adding the default=sys.stdin argument works if I call it like that

echo '{}' | ./script.py -

但不是这样:

echo '{}' | ./script.py

推荐答案

我会使用默认值为sys.stdinargparse.FileType.

import json,sys,argparse
parser = argparse.ArgumentParser(description='Template for python script managing JSON as input/output format')

group = parser.add_mutually_exclusive_group()
group.add_argument(
    '--input-file', '-i',
    type=argparse.FileType('r'),
    default=sys.stdin,
    help='Input file name containing a valid JSON.')
group.add_argument(
    'json',
    nargs='?',
    type=str,
    help='Input string containing a valid JSON.')
parser.add_argument(
    '--output-file', '-o',
    type=argparse.FileType('w'),
    help='Output file name.',
    default=sys.stdout)

args = parser.parse_args()
data = args.json or args.input_file.read()

datain=json.loads(data)
dataout=json.dumps(datain, indent=2)
args.output_file.write(dataout)

这篇关于Python argparse与stdin互斥,是选项之一的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆