2013-04-18 194 views
2

我要調用一個python函數pexpect.spawn(cmd),其中cmd是一個字符串如下:單引號和雙引號在Python中

ssh -t [email protected] 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"' 

的IP地址總是在不斷變化,所以它是這樣的:

ssh -t [email protected]%s 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"' %host_ip 

有幾個'",我不知如何處理它 所以基本上,它是關於如何處理在Python字符串 逃逸,當有一個變量子,如何

感謝

回答

7

對付它,你可以使用三引號:

"""ssh -t [email protected]{0} 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"'""".format(ip_address) 
+0

三'''',爲什麼不'''''? – misteryes

+4

任何一個人都應該工作,我只是更習慣於看到用於三重引號的雙打 –

+0

@misteryes他們都工作,但使用三個'''是在現有的Python代碼中更常見(或慣用)。這當然不會強迫你使用它的想法。 :) –

0

卡梅倫SPARR已經給出了通用的答案。

但在你的具體情況下,你可能不需要這個。

pexpect.spawn接受命令字符串命令字符串和單獨的參數字符串列表。對於其他庫中的大多數類似方法也是如此(例如標準庫subprocess模塊中的所有內容)。

所以,你只需要做出每個參數轉換成字符串,像這樣:

pexpect.spawn('ssh', ['-t', '[email protected]', 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"']) 

事實上,文件明確指出這一點,正是這個原因:

第二種形式在你希望產生一個命令並將它自己的參數列表傳遞給它自己的 的情況下,spawn(你傳遞參數列表的地方)是有用的 。這可以使語法更清晰。

當然你的情況,你實際上是在產卵一個命令的參數列表...其中一個是本身的命令產卵和參數列表(sudo)等幾個步驟下來該行(nohupbash,最後是tcp_sender),顯然pexpect只能幫助完成這些步驟中的第一個。幸運的是,在這種情況下,這就是你所需要的。

如果需要更多的,也有一些圖書館,在那裏,可以產生POSIX式引用的字符串進行參數列表(的shlex基本相反),但我需要的幾次之一,一個我發現原來是越野車,我最終自己重寫了它......其實並不複雜(基本上,只是逃避一切,然後引用所有參數)。但希望你永遠不必這樣做。