我想调用一个python函数pexpect.spawn(cmd)
,其中cmd是一个string,如下所示:
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
有几个'
和"
,我不知道如何处理它,所以基本上是关于如何处理在pythonstring中的转义,当有一个可变的子string,如何处理它
谢谢
你可以使用三重引号:
"""ssh -t kity@{0} 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"'""".format(ip_address)
卡梅伦·斯帕尔已经给出了通用的答案。
但在你的具体情况下,你可能不需要这个。
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
),显然,只有这些步骤中的第一步才有帮助。 幸运的是,在这种情况下,这就是你所需要的。
如果你需要更多的东西,那里有一些库可以从参数列表中生成POSIX风格的引用字符串(基本上与shlex
相反),但是有一些我需要一个,我发现它是越野车,我结束了自己重写它…其实并不复杂(基本上,只是逃避一切,然后引用所有参数)。 但希望你永远不会这样做。