我有一个字符串,这是一个框架命令,应该在命令行中执行
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的一部分。我手动复制粘贴打印输出并尝试发送它,我在接收服务器上看到相同的错误。但是,当我删除反斜杠时,它发送的陷阱没有任何截断。
答案 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的命令。