【发布时间】: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