2017-06-21 127 views
0

可能的How to start a background process in Python?使用Python 2.7

不過了許多解決方案的重複實現使用os.system(CMD&)行爲與子模塊,只os.system(commandToRunInBackground &)看似簡單,做的伎倆。 雖然根據Replacing os.system(),更推薦使用subprocess模塊。 那麼如何使用subprocess模塊在shell中運行後臺進程(注意,最後的&)。

+2

由於'subprocess.Popen'是非阻塞的,你爲什麼會想使用的背景是一個系統調用製成? –

+0

正如Zev所說 - 爲什麼你認爲你需要這個,而不是你在後臺運行的'subprocess.Popen()'-invoked命令的* default *行爲? –

+1

'subprocess.Popen'沒有與shell的'&'操作符等價,因爲在子進程中沒有選項可以調用'setpgid(0,0)'來創建一個在後臺的新組。否則,如果進程通過stdin從終端讀取數據,終端將不會通過SIGTTIN來終止它,因爲它仍然處於前臺進程組中。 – eryksun

回答

2

在現代操作系統中,進程自然是並行運行,並且有一個等待終止另一個是特殊情況。當在60年代後期設計&語法時,這是不同的。然後你必須標記並行執行。

在這個堅持到今天的shell上,也是因爲在許多情況下讓shell等待命令終止,然後允許來自用戶的下一個輸入,所以仍然存在沒有&等待的情況爲終止。

在編程層面上,&(並行執行)的情況是正常情況,不需要做任何事情來實現它。

通過顯式使用wait()系統調用可以實現沒有&(等待終止)的情況(這是大多數情況下shell的做法)。

對你來說,只是使用Popen不叫wait() ;-)

+1

值得一提的是,subprocess.Popen默認不運行該shell。它接受一個列表:'[program,arg1,arg2]'(看一個例子,調用'shlex.split(cmd)') – jfs

+0

對。當OP考慮使用'&'時,他們可能也會期待其他東西的shell解釋步驟。 – Alfe

+0

我同意你使用'Popen'的方式,但不同意順序執行只是60年代不推薦使用的特性。 shell默認使用順序執行,以允許同時輸入許多命令(例如從一個文件),同時允許每個命令使用前一個命令產生的結果。 –