Python subprocess在引号前发送反斜杠

4

我有一个字符串,这是一个带框架的命令,应该在命令行中执行

cmdToExecute = "TRAPTOOL -a STRING "ABC" -o STRING 'XYZ'"

我认为这个字符串包含了整个命令,应该从命令提示符触发。如果您仔细看一下cmdToExecute字符串,就可以看到带有单引号的值为XYZ的选项o。这需要使用单引号给出原因,否则我的工具TRAPTOOL将无法处理该命令。

我正在使用subprocess.Popen执行整个命令。 在将命令在shell中执行之前,我会打印出内容。

print "Cmd to be exectued: %r" % cmdToExecute
 myProcess = subprocess.Popen(cmdToExecute, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
(stdOut, stdErr) = myProcess.communicate()

上述命令的输出是, 要执行的命令:TRAPTOOL -a STRING "ABC" -o \'XYZ\'。 您可以看到输出显示在打印时自动添加了反斜杠。实际上,在使用正则表达式测试字符串时,\不存在于字符串中。但是,当在我的框架上运行脚本时,TRAPTOOL会截断接收服务器上的部分字符串XYZ。我手动复制并粘贴了打印输出并尝试发送它,我在接收服务器上看到了同样的错误。然而,当我删除反斜杠时,它可以发送trap而没有任何截断。
1. 有人能说出为什么会发生这种情况吗? 2. 是否有任何方式可以查看 subprocess.Popen 实际执行的命令? 3. 是否有其他方法可以执行我的命令,除了 subprocess.Popen,可能会解决这个问题?

1
"ABC" 应该是 \"ABC\" - Pyrce
如果您正在手动构建命令,则可以从一开始将其创建为列表:cmd = ['TRAPTOOL', '-a', 'STRING', 'ABC', '-o', 'STRING', 'XYZ']。请注意:引号内没有引号。也没有shell来解释它们。 - jfs
1
@Pyrce:或者可以使用三引号:r"""TRAPTOOL -a STRING "ABC" -o STRING 'XYZ'""" - jfs
2个回答

4

您要求的是字符串的repr表示,而不是str表示。基本上,您需要在Python交互式解释器中键入什么才能获得相同的输出?这就是%r显示的内容。将其更改为%s以查看实际存储的值:

print "Cmd to be exectued: %s" % cmdToExecute

你说得对,Kirk。%r 到 %s 帮助我理解了真正的问题。我误解了 Python 会用 \ 发送命令。但是,遵循 Alex 的评论文字逐字理解帮助我解决了这个问题。 - ASANT
那么,你把他标记为答案者是正确的做法!我很高兴我们能帮到你。 :-) - Kirk Strauser

4

尝试使用shlex来拆分您的命令字符串:

>>> import shlex
>>> argv = shlex.split("TRAPTOOL -a STRING \"ABC\" -o STRING 'XYZ'")
>>> myProcess = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
>>> (stdOut, stdErr) = myProcess.communicate()
Popen构造函数的第一个参数可以是您的shell命令或字符串的参数列表,但由于涉及到所有引号,使用参数列表可能更容易处理。 (请参见Python子进程文档。)
如果您想查看编写的命令,您可以尝试执行以下操作:
>>> argv = shlex.split("bash -x -c 'TRAPTOOL -a STRING \"ABC\" -o STRING \'XYZ\''")

这会使bash通过-x选项向shell输出命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接