gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:20:30 26 4
gpt4 key购买 nike

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

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\'。

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

  1. 谁能说说为什么会这样?
  2. 无论如何我们可以看到在 subprocess.Popen 中实际执行的命令是什么?
  3. 除了 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 subprocess documentation 。)

如果你想查看正在编写的命令,你可能会这样做:

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

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

关于python 子进程在引号前发送反斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22771957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com