【问题标题】:Need to pass string argument with single quotes using argparse需要使用 argparse 传递带单引号的字符串参数
【发布时间】:2019-10-13 14:56:15
【问题描述】:

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

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

【问题讨论】:

  • 什么是input_argument?请不要发布带有未定义变量名的代码。
  • -W'code=123 and fruits='Apple''
  • 不,不是。使用您的代码,我得到NameError: name 'input_argument' is not defined
  • input_arguement的代码是什么?
  • 对不起。修复了代码。请立即尝试

标签: python python-3.x arguments


【解决方案1】:

使用双引号

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

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

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

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' "]

【讨论】:

  • 注意:问题不断变化......所以可能已经过时了。 :)
  • 感谢您的建议。但是这个 python 文件是使用 shell 脚本调用的。我对 shell 脚本没有任何控制权。 shell 脚本使用双引号作为调用 python 文件的参数。所以我不能使用双引号作为参数。 PFB shell 脚本调用,shell_script.ksh -p py_script.py -a "-W ' code=123 and fruits='Apple' ' "
  • 对,这就是我从原帖中理解的。我相信你不能在不改变脚本的情况下使用 Python——我关于改变需求的观点是,作为一名程序员,你总是有机会就需求的技术难度提供反馈,而那些提出需求的人可能会接受你的反馈并更改脚本。如果您提供带有反馈的修复(即确切地如何更改脚本),则尤其如此。我认为您唯一的其他选择是不使用 Python。 (PS 只是让他们在脚本中转义双引号)。
  • 另请注意,如果您更改脚本,那么任何带双引号的输入都会有同样的问题。这是语言如何定义和解释字符串以及转义字符(如引号)的语言问题 - 这不是您可以直接解决的问题 - 脚本之间的接口必须适应语言限制 - 没有办法解决。
  • 谢谢 :) 感谢您的时间和建议!
猜你喜欢
  • 1970-01-01
  • 2019-11-20
  • 2022-06-11
  • 1970-01-01
  • 2014-04-13
  • 2022-10-24
  • 1970-01-01
  • 2011-04-14
  • 2019-11-20
相关资源
最近更新 更多