2014-08-29 35 views
0

因此,我試圖從一個python腳本發出這個命令,該腳本收集集羣中預定數目的節點上的cpu信息。在這裏我使用2的扇出,並且僅在節點b127到b129上運行它以用於測試目的。使用pdsh通過linux解析內聯python命令

pdsh -f2 -w b[127-129] 'python -c "import multiprocessing 
    num_cpu = multiprocessing.cpu_count() 
    stat_fd = open('/proc/stat') 
    stat_fd.close()"' 

我打印了命令,這就是它在終端上顯示的內容。因此,告訴我引號和命令格式正確。我通過執行以下代碼得到這個字符串:

python_command = "'python -c "\ 
       + "\"import multiprocessing\n"\ 
       + "num_cpu = multiprocessing.cpu_count()\n"\ 
       + "stat_fd = open(\'/proc/stat\')\n"\ 
       + "stat_fd.close()\"'" 

    command = "pdsh -f2 -w b[127-129] " + python_command 
    print command 

不幸的是,開放式(\「的/ proc/STAT \」)似乎是問題,因爲這是導致解析器失敗的唯一行的行由於嵌套的單引號。我已經嘗試過多次引用和轉義的組合,以使其無效。我在文件的打開和關閉之間省略了一些代碼,以儘量減少發佈的代碼。

我周圍搜索,發現這link,但發現它太簡單的例子,因爲我可以複製這些命令。是的,我知道我可以使用bash命令來獲得我想要做的事情,而且我可能會這樣做,但是這個讓我在牆上敲打我的頭。我也有使用top和ps收集數據的腳本,因此我不需要使用它們的解釋。我非常感謝提前的幫助。

+0

使用三重引號是嚴格回答您的問題的方法,但是您可能需要查看[ansible](http://www.ansible.com/)或[fabric](http:// www.fabfile.org/),它可以直接爲Python帶來與pdsh相同的並行SSH功能,避免了過度設計報價對的需要。 – damienfrancois 2014-08-29 12:07:53

+0

我會檢查一下,謝謝你的提示。 – 2014-08-29 13:29:53

回答

0

試試這個:

python_command = """pdsh -f2 -w b[127-129] 'python -c "import multiprocessing 
num_cpu = multiprocessing.cpu_count() 
stat_fd = open(\\"/proc/stat\\") 
stat_fd.close()"'""" 

在Python中,你可以使用包含新線和單/雙引號中的字符串三重引號("""..."""'''...''')。

最後一級引用(在open()一行)將需要轉義,以便它們不與外部引號衝突。您還需要轉義反斜槓,以便在解釋字符串時不會立即被Python使用:\\"

+0

獲勝者,非常感謝。我以前見過這個,但完全忘了,非常感謝先生。當我開始工作並檢查性能與我一直使用的其他方法時,我會嘗試一下。對不起,我不能投票,這是我的第一個堆棧溢出問題,所以我沒有15個代表點。 – 2014-08-29 13:33:07