2011-02-17 34 views
2

這是我的主文件:web.py +子=掛

import subprocess, time 

pipe = subprocess.PIPE 
popen = subprocess.Popen('pythonw -uB test_web_app.py', stdout=pipe) 
time.sleep(3) 

而這裏的test_web_app.py:

import web 

class Handler: 
    def GET(self): pass 
app = web.application(['/', 'Handler'], globals()) 
app.run() 

當我經營的主要文件,程序執行,但殭屍進程留下來,我必須手動殺死它。爲什麼是這樣?節目結束時我怎樣才能讓Popen死亡?如果在程序結束之前管理標準輸出和睡眠一段時間,Popen只會掛起。

編輯 - 這裏的主文件的最後,工作版本:

import subprocess, time, atexit 

pipe = subprocess.PIPE 
popen = subprocess.Popen('pythonw -uB test_web_app.py', stdout=pipe) 

def kill_app(): 
    popen.kill() 
    popen.wait() 
atexit.register(kill_app) 

time.sleep(3) 

回答

2

你沒有wait ED的過程。完成後,您必須致電popen.wait

您可以使用popen對象的poll方法檢查過程是否已終止,以查看它是否已完成。

如果您不需要Web服務器進程的標準輸出,則可以簡單地忽略stdout選項。


可以使用atexit模塊來實現一個被調用時,你的主文件退出掛鉤。這應該使用Popen對象的kill方法,然後使用wait來確保它已終止。

+0

子進程永遠不會做......它一直永遠服務。當父進程結束時(我關閉控制檯時),我希望子進程死掉。我需要標準輸出。 – 2011-02-17 09:47:08

+0

我已經更新了我的答案。 – 2011-02-17 09:49:19

1

如果你的主腳本不需要做別的,而子執行我會做:

import subprocess, time 

pipe = subprocess.PIPE 
popen = subprocess.Popen('pythonw -uB test_web_app.py', stdout=pipe, stderr=pipe) 
out, err = popen.communicate() 

(我認爲,如果你專門管標準輸出回你的程序,你需要閱讀它在某些時候可以避免造成殭屍進程 - 通信會以合理安全的方式讀取它)。

或者,如果你不關心解析標準輸出/標準錯誤,不打擾他們的管路:

popen = subprocess.Popen('pythonw -uB test_web_app.py') 
popen.communicate()