【问题标题】:How to perform a post action when a python subprocess is completepython子进程完成后如何执行发布操作
【发布时间】:2017-09-08 00:30:10
【问题描述】:

我有一个 python 脚本,它创建一个子进程来运行索引操作(logstash 到 elasticsearch)。

代码sn-p如下,

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

我不调用 process.wait(),因为我创建的子进程需要独立于脚本的其余部分运行。

但我必须在子流程完成后更新数据库记录。我正在运行的索引操作不允许我创建允许我更新数据库的发布作业调用。

如何使用 python 子进程处理这个问题?我确实将作业的 PID 存储在一个文本文件中,但我希望有一个触发器,它知道子进程何时完成以执行下一个脚本。

【问题讨论】:

    标签: python elasticsearch subprocess logstash


    【解决方案1】:

    由于您似乎将process 变量隐藏在某处,稍后您可以在调用其poll 方法后检查其returncode attribute

    如果该过程已完成,则其returncode 值将不是None,您可以更新您的数据库。

    【讨论】:

    • 这类似于我在帖子中提到的,我将 PID 存储在一个文本文件中,我可以使用该文件检查子进程是否完整。检查返回码必须通过稍后执行另一个脚本来完成,这不是我打算做的。我想发布要自动化的操作(应在子流程完成后立即运行)。
    • 您是说您希望您的程序启动多个进程然后终止吗?并且您想在每个子进程终止后运行数据库更新?您认为完成后代码将在哪里运行(即在什么进程上下文中)?
    • 没错,主要的python脚本将索引操作作为子进程执行。 “你认为完成后代码会在哪里运行(即在什么进程上下文中)?”这正是我被困的地方。子进程调用某个无法修改的程序/文件,因此我不能包含完成后脚本来更新那里的数据库。我希望如果子进程有回调,也许有一种更 Pythonic 的方式来做到这一点。
    • 回调是没有用的,除非回调和执行回调的代码在同一个进程中运行。您唯一的希望是定义一个运行 logstash 的 shell 脚本,然后执行仅在成功完成后运行的数据库更新命令。类似logstash -f sample.conf && update-the-database
    【解决方案2】:

    你可以在一个线程中创建你的进程。你可以从线程中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
    

    【讨论】:

    • 这看起来像我的写方法。但执行上述代码会引发错误“TypeError: 'Popen' object is not iterable”。看起来不允许在子进程中创建子进程。上面的代码你测试成功了吗?
    • 对不起,错字!固定的。我还没有测试过,但它与我写的东西非常相似,很有效。
    • 谢谢,错误确实消失了。但是,如果我执行上面的代码,一旦主线程代码完成,脚本就会挂在终端上,直到子进程完成。如何让子进程运行并退出主线程(如再次激活命令行)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多