2013-05-02 75 views
0

問題:Python轉義sed和bash命令與子進程

如何成功使用python sed?我必須在遠程服務器上運行此命令以獲取逗號分隔的主機列表。當從慶典跑我得到我想要的是像主機1,主機2,主機3

以下是我有:

process = subprocess.Popen(["ssh [email protected] knife search node "chef_environment:*" | grep -i "node name" | egrep -i "stuff|ruff" | uniq -u | sort -n | cut -d ":" -f 2 | sed -e 's/^[ \t]*//' | tr '\n' ', ' 
"], shell=False, stdout=PIPE) 

我知道我必須逃離\ n \ T,等等,但我在其他方面遇到麻煩。每當我嘗試從我的Python腳本運行它時,即使嘗試了一次逃生的聚寶盆,我也會得到無效語法的錯誤。

回答

2

由於您在雙引號字符串中使用",因此字符串引用被打破。你必須逃脫",比如\"。此外請注意,命令行中的大部分雙引號都可以用單引號'替代。下面的代碼應該工作:

process = subprocess.Popen(["ssh [email protected] knife search node \"chef_environment:*\" | grep -i 'node name' | egrep -i 'stuff|ruff' | uniq -u | sort -n | cut -d':' -f 2 | sed -e 's/^[ \t]*//' | tr '\n' ', '"], shell=False, stdout=subprocess.PIPE) 
+0

SyntaxError:在掃描字符串文字時的EOL – Kryten 2013-05-02 22:42:40

+0

只是爲了防止滾動條。現在它應該按原樣工作,但可讀性較差。 – hek2mgl 2013-05-02 22:52:09

+0

太棒了。你是一個拯救生命的人,謝謝! – Kryten 2013-05-02 23:04:36