首页 > 解决方案 > 需要使用 argparse 传递带单引号的字符串参数

问题描述

我有一个要求,我必须按照下面的确切顺序将参数传递给 python 脚本。我无法更改脚本的调用方式。

py_script.py -W ' code=123 and fruits='Apple' '

-W参数string在单引号内。字符串反过来包含一个单引号(fruits= 'Apple'

argparse用来处理这个

代码:

import argparse
parser = argparse.ArgumentParser(description="abc")
parser.add_argument('-W', '--filt', metavar='', help="Filter Condition", nargs='+')

args = parser.parse_args()
arg_str = ' '.join(args.filt)
print(args.arg_str)

预期结果:

code=123 and fruits='Apple'

实际结果:

code=123 and fruits=Apple

该代码正在剥离单引号。我如何获得预期的结果?

标签: pythonpython-3.xarguments

解决方案


使用双引号

一种解决方案是在参数周围使用双引号,如下所示:

python script.py -W " code=123 and fruits='Apple' "

剥离单引号的不是 argparser 包。它是 Python 对参数的内置 sys.argv 处理,和/或 Python 处理器本身。

Python 需要转义来处理相同类型的引号(单引号或双引号),但您可以嵌套相反类型的原始引号而无需转义字符。如果这违反了要求的规则 - 那么您可能需要使用不同的语言或回推要求。


分析

您可以通过直接查看 sys.argv 输出来测试它。

系统参数测试.py:

import sys

for arg in sys.argv:
   print('"{}"'.format(arg))

如果我喂python sysargtest.py -W ' code=123 and fruits='Apple' '

结果是:

$ py sysargtest.py -W ' code=123 and fruits='Apple' '
"sysargtest.py"
"-W"
" code=123 and fruits=Apple "

去掉单引号。解决此问题的一种方法是在命令行上使用双引号而不是单引号,如果这不是您的要求的一部分:

$ py sysargtest.py -W " code=123 and fruits='Apple' "
"sysargtest.py"
"-W"
" code=123 and fruits='Apple' "

通过该更改,argparse 将适用于原始脚本:

$ py script.py -W " code=123 and fruits='Apple' "
[" code=123 and fruits='Apple' "]

推荐阅读