2017-04-12 101 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

相关问题