如何在Python Click中将命令行剩余内容读入最后一个参数,忽略已有选项?
解决Click中捕获包含重复选项的剩余参数问题
要实现将脚本路径后的所有参数(包括与主脚本选项重名的内容)完整捕获为最后一个参数,只需在Click命令的context_settings中设置allow_interspersed_args=False,同时将最后一个位置参数设为nargs=-1来接收所有剩余内容。
示例代码
import click @click.command(context_settings={"allow_interspersed_args": False}) @click.option("-d", "--detach", is_flag=True, help="Detach the launcher process") @click.argument("script_path") @click.argument("script_args", nargs=-1) def launcher(detach, script_path, script_args): print(f"Detach: {detach}") print(f"Script path: {script_path}") print(f"Script args: {script_args}") if __name__ == "__main__": launcher()
原理说明
allow_interspersed_args=False:告诉Click所有主脚本的选项必须放在位置参数(这里是script_path)之前,位置参数之后的任何内容(包括看起来像选项的-d)都会被当作普通的位置参数处理,不会被解析为主脚本的选项。script_args的nargs=-1:表示该参数会捕获所有剩余的位置参数,不管数量多少,完美承接脚本路径后的所有内容。
测试验证
运行命令:
python launcher.py my_script.py -a -b -c -d -e
输出结果:
Detach: False Script path: my_script.py Script args: ('-a', '-b', '-c', '-d', '-e')
完全符合需求。如果需要启用主脚本的detach选项,只需将-d放在脚本路径之前:
python launcher.py -d my_script.py -a -b -c -d -e
此时输出:
Detach: True Script path: my_script.py Script args: ('-a', '-b', '-c', '-d', '-e')
主脚本的-d被正确识别,传递给子脚本的-d也被完整保留。
内容的提问来源于stack exchange,提问作者Petr Synek
相关产品推荐
相关产品推荐

