如何阻止Click框架对命令行参数中的环境变量进行自动展开?
如何阻止Click框架对命令行参数中的环境变量进行自动展开?
我完全懂你的痛点——明明用单引号把参数括起来,让shell别去解析环境变量了,结果Click还是自作主张把$M0这类变量给展开了,确实挺闹心的。
先回顾下你的代码场景:
import click @click.command() @click.argument('message') def main(message: str): click.echo(message) if __name__ == '__main__': main()
执行时你用了单引号包裹参数,结果还是被Click展开了:
➜ Desktop python foo.py '$M0/.viola/2025-01-25-17-20-23-307878' M:/home/ramrachum/.viola/2025-01-25-17-20-23-307878
解决这个问题其实很简单,Click默认开启了环境变量展开的功能,我们只需要在定义命令时禁用它就行。只需要给@click.command()添加一个context_settings参数,把expand_envvars设为False:
修改后的代码如下:
import click @click.command(context_settings={"expand_envvars": False}) @click.argument('message') def main(message: str): click.echo(message) if __name__ == '__main__': main()
现在再执行同样的命令,Click就会原封不动地输出你传入的参数了:
➜ Desktop python foo.py '$M0/.viola/2025-01-25-17-20-23-307878' $M0/.viola/2025-01-25-17-20-23-307878
简单解释下:expand_envvars这个配置项控制Click是否自动解析参数中的环境变量占位符,默认值是True,改成False后,它就会完全保留参数的原始字符串,不再做任何展开处理。
备注:内容来源于stack exchange,提问作者Ram Rachum
相关产品推荐
相关产品推荐

