我有一个字符串,它是一个应该在命令行中执行的框架命令
cmdToExecute =“TRAPTOOL -a 字符串“ABC”-o 字符串'XYZ'”
我正在考虑该字符串具有应从命令提示符触发的整个命令。如果仔细查看字符串 cmdToExecute,您可以看到选项 o 的值 XYZ 括在单引号中。有一个原因需要用单引号给出,否则我的工具 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 部分。我手动复制粘贴打印输出并尝试发送它,我在接收服务器上看到了相同的错误。然而,当我删除反斜杠时,它发送的陷阱没有任何截断。
- 谁能说出为什么会发生这种情况?
- 无论如何,我们是否可以看到 subprocess.Popen 中实际执行的命令是什么?
- 除了 subprocess.Popen 之外,还有其他方法可以执行我的命令来解决这个问题吗?
尝试使用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 子进程文档 https://docs.python.org/2/library/subprocess.html#popen-constructor.)
如果您想查看正在编写的命令,您可能可以执行以下操作:
>>> argv = shlex.split("bash -x -c 'TRAPTOOL -a STRING \"ABC\" -o STRING \'XYZ\''")
这使得bash
通过以下方式将命令回显到 shell-x
option.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)