如何让Python的argparse正常接收包含$字符的字符串参数
问题根因
这个参数截断和argparse无关,是macOS默认的shell(zsh/bash)的变量展开机制导致的:
当你用双引号包裹带$的参数时,shell会先把$开头的内容识别为变量进行替换,如果对应变量没有赋值就会被替换为空,所以"file$102_a.txt"在传入Python脚本前就已经被shell处理成了file,argparse接收到的本身就是截断后的内容。argparse本身对入参字符串的字符没有特殊限制,只要shell能把完整内容传入,就能正常解析。
解决方法
- 优先推荐:用单引号包裹参数
单引号在shell中会禁用所有特殊字符转义和变量展开,内容会原封不动传给程序,运行示例:python your_script.py 'file$102_a.txt'
argparse即可拿到完整的带$的字符串。 - 备选方案:对
$加转义符
如果必须用双引号,可以在每个$前加反斜杠\转义,告知shell不要做变量展开,运行示例:python your_script.py "file\$102_a.txt"
也能拿到完整内容。
验证示例
你可以用以下极简脚本测试效果:
import argparse parser = argparse.ArgumentParser() parser.add_argument("file_name", type=str) args = parser.parse_args() print(args.file_name)
用上述两种方法传参,就能正常输出完整的file$102_a.txt。
内容的提问来源于stack exchange,提问作者amc007
相关产品推荐
相关产品推荐

