我張望了一下看着執行使用subprocess.Popen()的Python腳本,但我似乎無法來解決這個問題,我有。我想在我的django應用程序的視圖內執行一個python腳本。我已經將要執行的代碼放入django管理命令中,以便通過命令行python manage.py command-name
訪問它。然後我嘗試使用subprocess.Popen("python manage.py command-name",shell=True)
來運行此命令。在Django視圖
但是,該命令可能需要一些時間來執行,所以我想認爲繼續並允許腳本在後臺執行。使用subprocess.Popen單獨似乎使視圖掛起,直到劇本已經完成,所以我嘗試使用一個線程(以下another SA問題):
class SubprocessThread(threading.Thread):
def __init__(self, c):
self.command = c
self.stdout = None
self.stderr = None
threading.Thread.__init__(self)
def run(self):
p = subprocess.Popen(self.command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
self.stdout, self.stderr = p.communicate()
,然後執行它:
t = SubprocessThread("python manage.py command-name")
t.setDaemon(True)
t.start()
t.join()
但是,視圖仍然掛起:光標有一個忙符號,頁面上的AJAX不加載。否則,在線程調用看起來正常完成(在腳本完成之前)之後,頁面的html似乎在視圖中正常加載和命令。有人可以幫幫我嗎?我希望腳本能夠執行並自己做,而不必在頁面上保留視圖或AJAX調用。
我經常使用類似的模式(以'subprocess',因爲'thread'被殺害視圖功能退出時),並且我經常忘記在返回的東西查看功能,使瀏覽器掛起。然後,我責怪subporcess,而我只是忘了返回一個'HttpResponse'。檢查一下! – Dunatotatos 2017-10-31 08:23:44