2017-04-12 93 views
1

我有一個python腳本,它創建一個運行索引操作的子進程(logstash to elasticsearch)。如何在python子進程完成後執行post操作

的代碼片段如下,

process = subprocess.Popen([logstash, '-f', sample.conf], 
            stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

我不叫process.wait(),作爲子我創建需要獨立運行腳本的其餘部分。

但我必須在子流程完成時更新數據庫記錄。我正在運行的索引操作不允許我創建一個後期作業調用,這將允許我更新數據庫。

我該如何處理python子流程?我將作業的PID存儲在一個文本文件中,但是我想要一個觸發器來知道子流程何時完成以執行下一個腳本。

回答

0

你可以在一個線程中創建你的進程。您可以wait從線程,所以你得到的輸出,它的無阻塞

import threading 
import subprocess 

def run_command(): 
    p = subprocess.Popen([logstash, '-f', sample.conf], 
           stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
    output = p.stdout.read() 
    p.wait() 
    # now your command has ended, do whatever you like 

,並在你的主線程:

t = threading.Thread(target=run_command) 
t.start() 
# continue with main processing 
+0

這看起來像寫給我的方法。但執行上面的代碼會拋出一個錯誤「TypeError:'Popen'對象不可迭代」。它看起來像在子流程內創建子流程是不允許的。你成功測試過上面的代碼嗎? – Vinod

+0

對不起,錯字!固定。我沒有測試過,但它與我寫的東西非常相似,這很有用。 –

+0

謝謝,錯誤消失了。但是,如果我執行上面的代碼,一旦主線程代碼完成,腳本掛在終端上,直到子進程完成。如何讓子進程運行並退出主線程(如使命令行再次激活)? – Vinod

0

既然你出現在某處藏匿process變量,以後你在調用poll方法後可以檢查其returncode attribute

如果該過程已完成,則其returncode值不會是None,您可以更新數據庫。

+0

這與我在文章中提到的類似,我將PID存儲在一個文本文件中,通過該文件我可以檢查子進程是否完成。檢查返回碼將不得不通過稍後執行另一個腳本來完成,這不是我打算做的。我想發佈操作以實現自動化(應在子流程完成後立即運行)。 – Vinod

+0

你是說你想要你的程序啓動一些進程然後終止?並且你想在每個子進程終止後運行數據庫更新?你在哪裏想象(即在什麼流程上下文中)完成後代碼將運行? – holdenweb

+0

沒錯,主要的python腳本以子流程的形式執行索引操作。 「你在哪裏想象(即在什麼流程上下文中)完成後代碼將運行?」這正是我卡住的地方。子進程調用某個無法修改的程序/文件,因此我無法包含完成後腳本以更新數據庫。我希望如果子進程會有回調,也許有一種更pythonic的方式來做到這一點。 – Vinod

相關問題