如何在Python argparse中为字符串参数保留引号符号
解决Python命令行参数保留原始引号的问题
核心原因
shell在把参数传给Python程序前,会自动解析并移除引号,所以不管是sys.argv还是argparse,拿到的都是已经处理过的参数,原生没法保留输入时的引号。要实现需求,得绕开shell的解析逻辑,或者换一种方式捕获输入。
实用解决方法
方法1:直接读取原始输入并手动解析
跳过shell的参数解析,直接读取用户的整行输入,用正则匹配带引号和不带引号的参数,完整保留原始格式。示例代码:
import re import sys def parse_raw_args(raw_input): # 正则匹配:要么是双引号包裹的内容,要么是连续非空白字符 pattern = r'"[^"]+"|\S+' return re.findall(pattern, raw_input) # 读取命令行的原始输入(如果是直接运行脚本,从stdin读取整行) if len(sys.argv) == 1: raw_input = sys.stdin.readline().strip() else: # 如果参数是通过其他方式传入,拼接成原始字符串 raw_input = ' '.join(sys.argv[1:]) parsed_args = parse_raw_args(raw_input) print(parsed_args)
测试输入"Hello" -s "5" 98.5 --file True,输出正好是你要的['"Hello"', '-s', '"5"', '98.5', '--file', 'True']。
方法2:让用户输入时转义引号(需用户配合)
如果用户输入时给引号加转义,比如\"Hello\" -s \"5\" 98.5 --file True,那么sys.argv会直接拿到带引号的参数,但这种方式需要用户手动转义,不够友好,适合特定场景。
关于你尝试过的工具说明
shlex.join和shlex.quote是用来处理参数拼接、转义的工具,不是用来保留原始输入引号的,所以不适用你的场景。sys.argv和argparse本身没法保留引号,因为shell已经把引号处理掉了,这是shell的默认行为,和Python无关。
内容的提问来源于stack exchange,提问作者ArianNa
相关产品推荐
相关产品推荐

