【问题标题】:Start process and reuse with PID in python在python中使用PID启动进程并重用
【发布时间】:2014-05-22 01:20:46
【问题描述】:

我的主进程/线程启动一个可执行文件,该可执行文件在回显Algorithm loaded 后开始等待信号。我正在使用subprocess.Popen 类来运行可执行文件。 稍后,将启动一个线程,该线程应该向较早启动的可执行文件发送信号。但我不知道如何从该线程向该特定子进程发送信号。
是否可以使用PID 传递PID“recover” 子流程?重用进程的目的是发送相当于stdin的东西。


这是我启动可执行文件的代码:

def start_module():
    cmd = '%s/libraries/OpenBR' % settings.MODULES_DIR
    process = subprocess.Popen(cmd,stdout=subprocess.PIPE)

    while True:
        line = process.stdout.readline()
        if line.find('Algorithm loaded') > -1:
            break

    return 0

【问题讨论】:

    标签: python multithreading subprocess executable


    【解决方案1】:

    代码中的process 变量引用了Popen 对象,该对象支持pid 属性。如果你有你的start_module 函数返回进程,你可以稍后使用os.kill 向它发送一个信号。例如:

    def start_module():
        cmd = '%s/libraries/OpenBR' % settings.MODULES_DIR
        process = subprocess.Popen(cmd,stdout=subprocess.PIPE)
    
        while True:
            line = process.stdout.readline()
            if line.find('Algorithm loaded') > -1:
                break
    
        return process
    
    p = start_module()
    os.kill(p.pid, signal.SIGALRM)
    

    据我所知,使用线程或不发送信号应该没有任何区别。请注意,os.kill 不一定会杀死进程:它会向它发送一个信号,然后该进程可以适当地处理(这里是 ALARM 信号)。


    如果您的意图是将一些输入传递给进程的stdin,那么事情也很简单。您只需将stdin=subprocess.PIPE 添加到Popen 调用并打印到新进程的stdin 属性:

    def start_module():
        cmd = '%s/libraries/OpenBR' % settings.MODULES_DIR
        process = subprocess.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
    
        while True:
            line = process.stdout.readline()
            if line.find('Algorithm loaded') > -1:
                break
    
        return process
    
    p = start_module()
    print >> p.stdin, "Hello world!"
    print >> p.stdin, "How are things there?"
    

    【讨论】:

    • 杀死进程不是目的,而是向它发送stdin。基本上是发送一个参数并接收结果。我相信我的问题不清楚,但感谢您的回答。
    • @PhilipMasek os.kill 可用于向子进程发送任意信号,而不仅仅是杀死它。你说你想在你原来的问题中发送一个信号,虽然听起来你可能真的想写到子进程的标准输入?
    • 好吧,我想我做到了。但是现在我在阅读stdin 的输出时遇到了问题。我试过这个:process.stdin.write(image_directory) print process.stdout.readline() 但是线程只是静止在打印上,没有打印任何东西。我不想关闭进程。我只想要在给出image_director 之后的输出。我以后需要能够再次使用另一个image_directory 写信给stdin 并从中检索结果。
    • 我找到了我最后一个问题的答案,我将这个:http://stackoverflow.com/a/4343917/1052393 与这个:http://stackoverflow.com/a/13605804/1052393Althoug 结合起来,我只从标准输出中得到第一行......任何线索?
    猜你喜欢
    • 2016-07-23
    • 1970-01-01
    • 2023-03-18
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 2013-01-25
    • 2011-10-06
    相关资源
    最近更新 更多