python子进程在引用之前发送反斜杠

时间:2014-03-31 20:52:59

标签: python regex subprocess

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

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

我正在考虑使用字符串来获取应该从命令提示符触发的整个命令。如果仔细查看字符串cmdToExecute,可以在SINGLE QUOTE中看到包含值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 \'。

您可以看到输出显示打印时自动添加的BACKWARD SLASH。实际上,字符串中没有\,我使用正则表达式进行测试。但是,当脚本在我的盒子上运行时,TRAPTOOL会截断接收服务器上字符串XYZ的一部分。我手动复制粘贴打印输出并尝试发送它,我在接收服务器上看到相同的错误。但是,当我删除反斜杠时,它发送的陷阱没有任何截断。

  1. 任何人都可以说为什么会这样?
  2. 无论如何我们可以看到在subprocess.Popen中实际执行了什么命令?
  3. 除了可以解决这个问题的subprocess.Popen之外,还有其他方法可以执行我的命令吗?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

尝试使用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 subprocess documentation。)

如果您想查看正在编写的命令,您可能会执行以下操作:

>>> argv = shlex.split("bash -x -c 'TRAPTOOL -a STRING \"ABC\" -o STRING \'XYZ\''")

这使得bash通过-x选项回显shell的命令。