如何用argparse实现命令行参数与标准输入的互斥字符串传入?
实现命令行参数或标准输入二选一的Python脚本
我来帮你完善这个需求的实现脚本,同时拆解关键逻辑,让你明白每一步的作用:
完整可运行脚本
#!/usr/bin/env python import argparse from sys import stdin def main(): parser = argparse.ArgumentParser(description='接收输入:要么通过命令行参数,要么通过标准输入,二选一') # 创建互斥组,强制用户必须选择一种输入方式 input_group = parser.add_mutually_exclusive_group(required=True) # 可选位置参数:用户直接传字符串时使用 input_group.add_argument('str_arg', nargs='?', type=str, help='作为命令行参数传入的字符串') # 触发选项:用户选择从标准输入读取时使用 input_group.add_argument('--from-stdin', action='store_true', help='从标准输入读取内容') args = parser.parse_args() # 处理输入内容 if args.from_stdin: # 读取标准输入的所有内容,strip()去掉首尾空白(可根据需求调整) input_str = stdin.read().strip() if not input_str: parser.error('标准输入不能为空!') else: input_str = args.str_arg if not input_str: parser.error('命令行参数不能为空!') # 这里替换成你的业务逻辑,比如打印输入内容 print(f'收到的输入内容:{input_str}') if __name__ == '__main__': main()
关键逻辑说明
- 互斥组配置:
add_mutually_exclusive_group(required=True)是核心,它确保用户只能选一种输入方式——既不能同时传命令行参数和--from-stdin,也不能两者都不传。 - 可选位置参数:
nargs='?'让str_arg变成可选参数,这样当用户使用--from-stdin时,不需要额外传位置参数,argparse不会抛出错误。 - 标准输入读取:当用户指定
--from-stdin时,用stdin.read()读取所有输入内容;strip()是为了清理首尾的换行和空格,如果需要保留原始格式,可以去掉这个方法。 - 空输入校验:添加了对空输入的判断,避免用户传入空字符串或者标准输入为空的情况,用
parser.error()抛出清晰的错误提示。
使用示例
- 通过命令行参数传入
python my_script.py "这是命令行传入的内容"
输出:
收到的输入内容:这是命令行传入的内容
- 通过标准输入传入
可以用管道传递内容:
echo "这是从标准输入来的内容" | python my_script.py --from-stdin
也可以直接交互式输入:
python my_script.py --from-stdin # 此时输入内容,按Ctrl+D(Linux/macOS)或Ctrl+Z(Windows)结束输入
- 错误场景演示
- 既不传参数也不指定
--from-stdin:
python my_script.py
会报错:
error: one of the arguments str_arg --from-stdin is required
- 同时传参数和
--from-stdin:
python my_script.py "测试内容" --from-stdin
会报错:
error: argument --from-stdin: not allowed with argument str_arg
内容的提问来源于stack exchange,提问作者solimant
相关产品推荐
相关产品推荐

