使用带双引号和变量的Popen

时间:2014-01-04 00:29:53

标签: python variables popen double-quotes

我花了几个小时研究这个并阅读有关SO和python文档的其他问题,但还没有解决这个问题。

我试图让python发送带有双引号(“)的echo命令,并使用变量在ssh上修正间距。

以下是相关的代码段:

ssh_upd = Popen([
    'ssh', server, 'sudo', '-S',
    "echo' " "" + mtpt + "  " + "   " +filervol + "'",
    "|", "sudo tee -a", "/etc/"+map, ">", "/dev/null" ], stdout=None, stdin=PIPE, stderr=STDOUT)

mtpt和filervol都是前面代码中定义的变量。

上面的代码产生了这个输出:

sudo: echo junk         junk:/vol/junk: command not found

python需要发送:

echo "junk              junk:/vol/junk"

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我不确定你在这里要做什么:

"echo' " ""

...但是Python将如何解释它:

首先,"echo' "是一个6个字符的字符串(单词echo,单个'和空格)。然后""是一个空字符串。它们连接在一起(当然形成相同的6个字符的字符串)。

如果要将双引号字符放入双引号字符串中,则必须使用反斜杠转义它们,如下所示:

"echo' \" \""

但是,有一种更容易处理这个问题的方法:只使用三引号。大多数人都将三重引用作为一种处理多行字符串的方式进行了学习,而且它非常适合 - 但它对于同时包含两种引号的字符串也很有用:

'''echo' " "'''

此外,不是一遍又一遍地打开和关闭引号,因此您可以使用字符串连接,使用单个格式字符串并在其上调用format(或者,如果您愿意,也可以使用%运算符。


但同时,如果你要发送的是这个:

echo "junk              junk:/vol/junk"

我不知道为什么你开始使用echo'作为字符串的开头,但你明显出现了问题。你想要的是:

'''echo "{0}     {1}"'''.format(mtpt, filervol)

我在那里放了5个空格,因为原始代码有一个2空格字符串添加到3空格字符串。但是你想要的输出有14个空格,所以......我不确定你到底想要什么。如果实际代码中涉及的标签在复制粘贴到StackOverflow时丢失了,我建议在文字中使用\t转义而不是实际标签。

答案 1 :(得分:2)

如果您在命令中使用|>,则还需要使用shell=True

如果你使用shell=True,那么Popen的第一个参数应该是一个字符串,而不是一个列表:

ssh_upd = Popen(
    'ssh {server} sudo -S echo "{mtpt}      {filervol}" | sudo tee -a /etc/{map} > /dev/null'.format(server=server, mtpt=mtpt, filervol=filervol, map=map), stdout=None, stdin=PIPE, stderr=STDOUT, shell=True)

请注意,如果发送给Popen的命令包含用户输入,则不应使用shell=True,因为它可能存在安全风险。 (请务必阅读the Warning in the docs。)

您可以避免使用shell=True和管道|以及使用多个Popens connecting one's stdout to the next one's stdin重定向>