需要使用argparse传递带单引号的字符串参数

时间:2019-10-13 14:56:15

标签: python python-3.x arguments

我有一个要求,我必须按照以下确切顺序将参数传递给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

该代码去除了单引号。我如何获得预期的结果?

1 个答案:

答案 0 :(得分:1)

使用双引号

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

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

不是argparser软件包删除了单引号。它是Python对参数和/或Python处理器本身的内置sys.argv处理。

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


分析

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

sysargtest.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' "]
相关问题