如何让argparse仅识别参数开头的选项?有无替代解析包?
实现类似
getopt.getopt的参数解析方案 用argparse实现的两种思路
1. 借助--分隔符(原生支持)
argparse本身支持用--明确区分主程序选项和后续的命令参数,用户在命令行输入时加上--,就能把后面所有内容完整当作位置参数传递。
示例代码:
import argparse parser = argparse.ArgumentParser(description='类似watch的程序') parser.add_argument('-n', '--interval', type=int, default=1, help='执行间隔(秒)') # nargs=REMAINDER 表示接收所有剩余参数 parser.add_argument('command', nargs=argparse.REMAINDER) args = parser.parse_args() print(f"执行间隔: {args.interval}") print(f"要执行的命令及参数: {args.command}")
运行示例:
python watch.py -n1 -- date -u
输出会得到command为['date', '-u'],直接拿去执行即可。
2. 手动拆分参数,模拟getopt行为
如果不想让用户输入--,可以手动遍历sys.argv,找到第一个非选项参数的位置,拆分后分别解析:
示例代码:
import argparse import sys def split_main_and_command_args(argv): # 从第1个参数开始(跳过脚本名),找第一个不以'-'开头的参数 split_pos = len(argv) for idx, arg in enumerate(argv[1:], start=1): if not arg.startswith('-'): split_pos = idx break # 返回主程序选项、命令及参数 return argv[1:split_pos], argv[split_pos:] main_args, command_args = split_main_and_command_args(sys.argv) # 解析主程序自己的选项 parser = argparse.ArgumentParser() parser.add_argument('-n', '--interval', type=int, default=1) args = parser.parse_args(main_args) print(f"执行间隔: {args.interval}") print(f"要执行的命令及参数: {command_args}")
运行示例:
python watch.py -n1 date -u
无需--就能正确拆分,和getopt.getopt的行为完全一致。
其他内置可选包
直接用getopt
既然你已经知道getopt.getopt支持这种解析逻辑,直接用它最直接,代码简单直观:
import getopt import sys interval = 1 command_args = [] try: # 只解析自己的短选项,剩下的自动归入args opts, command_args = getopt.getopt(sys.argv[1:], "n:") except getopt.GetoptError as err: print(err) sys.exit(2) for opt, val in opts: if opt == '-n': interval = int(val) print(f"执行间隔: {interval}") print(f"要执行的命令及参数: {command_args}")
这个方案完全贴合你的需求,解析完自身选项后,command_args就是目标程序及其参数。
shlex(用于复杂命令拆分)
如果需要处理带空格、引号的命令参数(比如用户输入"echo hello world"),可以配合shlex来拆分字符串,但如果是直接从命令行获取argv,前面的方案已经足够覆盖大多数场景。
内容的提问来源于stack exchange,提问作者lukasl
相关产品推荐
相关产品推荐

