Python argparse与stdin互斥,是选项之一 [英] Python argparse mutually exclusive with stdin being one of the options
本文介绍了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.py
或cat 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
orcat 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.stdin
的argparse.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屋!
查看全文