我想调用python函数pexpect.spawn(cmd)
,其中cmd是一个字符串,如下所示:
ssh -t kity@192.199.61.205 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"'
ip地址总是在变化,所以它类似于:
ssh -t kity@%s 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"' %host_ip
有几个'
和"
,我不知道如何处理它
所以基本上,它是关于如何处理python字符串中的转义
当有一个变量子串时,如何处理它
感谢
答案 0 :(得分:7)
你可以使用三重引号:
"""ssh -t kity@{0} 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"'""".format(ip_address)
答案 1 :(得分:0)
Cameron Sparr已经给出了通用答案。
但在你的具体情况下,你可能不需要这个。
pexpect.spawn
接受命令和参数字符串或命令字符串和单独的参数字符串列表。对于其他库中的大多数类似方法(例如标准库subprocess
模块中的所有内容)也是如此。
所以,你只需要将每个参数都变成一个字符串,如下所示:
pexpect.spawn('ssh', ['-t', 'kity@192.199.61.205', 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"'])
事实上,文档特别提出了这一点,正是出于这个原因:
第二种形式的spawn(传递参数列表)很有用 在您希望生成命令并将其传递给自己的情况下 参数列表。这可以使语法更清晰。
当然,在你的情况下,你实际上正在生成一个带有参数列表的命令...其中一个本身就是一个生成命令和一个参数列表(sudo
),等等几步最后一行(nohup
,bash
,最后是tcp_sender
),显然pexpect
只能帮助完成这些步骤中的第一步。幸运的是,在这种情况下,这就是你所需要的。
如果你做需要更多,那里有一些库可以从参数列表中生成POSIX风格的引用字符串(基本上与shlex
相反),但是几次我需要一个,我发现的那个变成了马车,我最后自己重写了它......实际上并没有那么复杂(基本上,只是逃避一切然后引用所有的论点)。但希望你永远不必这样做。