Python命令行无法识别含'-'的参数,该如何解决?
如何传递含'-'的内容作为argparse命令行参数?
问题场景
我编写了以下Python代码,使用argparse接收多个命令行参数:
import argparse parser = argparse.ArgumentParser() parser.add_argument("--cmd_list", nargs="+") args = parser.parse_args() cmd_list = args.cmd_list print(cmd_list)
传递带$的参数时,用引号包裹即可正常运行,例如:
python3 myfile.py --cmd_list 'sh' '$L'
但传递以-开头的参数(如-L)时,即使加了引号,执行以下命令仍会报错:
python3 myfile.py --cmd_list 'sh' '-L'
错误信息:
error: unrecognised arguments: -L
解决方法
方法1:使用--分隔符(推荐)
这是POSIX命令行的标准用法,--会告知argparse,其后方的所有内容都视为普通参数,不再解析为命令行选项。修改命令为:
python3 myfile.py --cmd_list 'sh' -- '-L'
如果需要将所有--cmd_list的参数都放在--之后,也可以这样写:
python3 myfile.py -- --cmd_list 'sh' '-L'
方法2:修改argparse解析逻辑
可以改用parse_known_args()方法,它会将无法识别的参数(包括以-开头的内容)收集起来,手动将这些参数合并到目标列表中即可。修改后的代码:
import argparse parser = argparse.ArgumentParser() parser.add_argument("--cmd_list", nargs="+") args, unknown = parser.parse_known_args() # 将未知参数合并到cmd_list if unknown: args.cmd_list = args.cmd_list + unknown if args.cmd_list else unknown print(args.cmd_list)
执行原命令即可正常接收-L:
python3 myfile.py --cmd_list 'sh' '-L'
方法3:shell转义(不推荐)
在-前添加反斜杠进行转义,让shell将其视为普通字符:
python3 myfile.py --cmd_list 'sh' '\-L'
这种方法依赖具体shell的转义规则,通用性较差。
内容的提问来源于stack exchange,提问作者mang4521
相关产品推荐
相关产品推荐

