【问题标题】:CommandLineParser (LenientPosixParser) doesn't recognize escaped double quoteCommandLineParser (LenientPosixParser) 无法识别转义的双引号
【发布时间】:2021-11-30 07:04:11
【问题描述】:

对不起,我不是 python 专家。 有人可以解释一下以下代码的行为:

import sys

def send_cmd():

    param = r'--password="some\"pass"'

    print >> sys.stdout, param

    cmd = [
        '--adminName', 'admin',
        param,
        '--host', '127.0.0.1',
    ]

    print >> sys.stdout, cmd

if __name__ == "__main__":
    send_cmd()

我得到的输出如下:

--password="some\"pass"
['--adminName', 'admin', '--password="some\\"pass"', '--host', '127.0.0.1']

因此,当我将原始值分配给变量时,我得到一个反斜杠,但是当我将此 var 放入数组时,它会将字符串转换为具有双反斜杠。 但我想保持原样 - 带有一个反斜杠的原始值。 我怎样才能做到这一点?

谢谢。

更新:

当我尝试在 Java 应用程序中获取密码值时,会发生实际问题。 Python 将 cmd 传递给 java 的形式为:

jar javaApp --adminName admin --password="some\\"pass"--host 127.0.0.1

在 java 应用程序中,我使用 org.apache.commons.cli.CommandLine.getOptionValue("--password") 哪个返回我“一些(双反斜杠)”通过“并且java无法逃脱双引号

UPD2:

好的,事实证明,python 实际上不是问题。 问题是 CommandLineParser (LenientPosixParser) 无法正确解析使用转义字符传递的参数。所以当我传递到命令行时:

--password "some\"pass"

CommandLineParser 返回 "some"pass" 值而不修剪周围的引号并且不转义双引号字符。

【问题讨论】:

  • 您可能希望将'--password''some"pass' 存储为cmd 的两个独立元素。 cmd 本身可能根本不应该转换为字符串,而是按原样与subprocess.run 之类的命令一起使用。
  • 我已经更新了描述,我正在使用 --param="value" 模式,因为密码是通过命令行传递的,它可以包含前导破折号“-”和其他类型的特殊符号。

标签: java parsing command-line escaping special-characters


【解决方案1】:

如果字符串最初是用r 前缀定义的,Python 不会跟踪。

值始终相同,只是打印值时表示的问题。

比较:

>>> param = r'--password="some\"pass"'
>>> param
'--password="some\\"pass"'
>>> print(param)
--password="some\"pass"
>>> print(repr(param))
'--password="some\\"pass"'
>>> param == r'--password="some\"pass"'
True
>>> param == '--password="some\\"pass"'
True

【讨论】:

  • 实际上在我将这个值传递给java命令到with sp.Popen之后,它就像“some\\”pass”。出于参数解析的目的,我使用org.apache.commons。 cli.CommandLine.getOptionValue 方法,它返回以下值“some\\”pass。所以java不能将双反斜杠解释为转义符号
【解决方案2】:

我不知道为什么会这样,但你可以使用 for 循环遍历 cmd 并输出每个字符串

for i in cmd:
    sys.stdout.write(i+' ')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    相关资源
    最近更新 更多