2012-05-30 188 views
2

我試圖從子調用執行與GNU屏幕的服務器守護程序,但它甚至沒有開始從python啓動gnu屏幕?

subprocess.call(["screen", "-dmS test ./server"]) 

有人告訴我,運行屏幕需要終端,因此原因,我不能簡單地調用執行它。你能告訴我一些代碼來做到這一點嗎?

回答

5

嘗試

subprocess.call(["screen", "-d", "-m", "-S", "test", "./server"]) 

你需要打破參數字符串轉換成單獨的參數,每串之一。

下面是來自subprocess文檔相關報價:

在UNIX上,殼= False(默認值):在這種情況下,POPEN類 使用os.execvp()來執行子程序。參數通常應該是 是一個序列。一個字符串將被視爲一個字符串 作爲唯一項目(要執行的程序)。

在UNIX上,使用shell = True:如果args是字符串,則它指定要通過shell執行的 命令字符串。如果ARGS是一個序列, 第一個項目指定命令串,和任何其他項 將被視爲附加的殼參數。

因此,默認情況下,參數的使用與您給予的完全相同;它不會嘗試將字符串解析爲多個參數。如果設置shelltrue,你可以嘗試以下方法:

subprocess.call("screen -dmS test ./server", shell=True) 

和字符串會被解析酷似一個命令行。

+0

我測試過了,它在我的機器上工作。 –

+0

謝謝!這很有效,但奇怪的是我需要打破所有的參數。以爲我可以把所有的參數放在一起 – Flint

+0

答案更新(試圖)解釋爲什麼分手參數是必要的。 – chepner