在python中启动进程并重用PID

时间:2014-05-22 01:20:46

标签: python multithreading subprocess executable

我的主进程/线程启动一个可执行文件,它在回显Algorithm loaded后开始等待信号。我正在使用subprocess.Popen类来运行可执行文件。 稍后,启动一个线程,该线程应该向先前启动的可执行文件发送信号。但我不知道如何从该线程向该特定子进程发送信号 是否可以使用PID传递PID“恢复”子流程?重用该过程的目的是发送相当于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

1 个答案:

答案 0 :(得分:3)

代码中的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?"