python - 在python中使用PID启动进程并重用

标签 python multithreading subprocess executable

我的主进程/线程启动一个可执行文件,该可执行文件在回显加载算法后开始等待信号。我正在使用 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

最佳答案

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

关于python - 在python中使用PID启动进程并重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23796361/

相关文章:

python - Python:可以在线程中调用subprocess.Popen吗?

python - 像命令行模拟器一样使用 python 子进程模块

python - 如何为 python 包模块启用自动完成 (IntelliSense)?

python - python中不允许嵌套类中的类变量的原因是什么?

asp.net - ASP.NET 中的多线程

java - 在对象创建期间是否可以观察最终数组的中间状态?

Python运行带有子进程的cm​​d命令(ffmpeg)并在执行某些代码之前等待cmd关闭

Python正则表达式匹配完整的句子,包括关键字,而不中断不结束句子的句点(.com、U.S.等)

python - 为什么我会收到 AttributeError 消息?

java - RabbitMQ 跨多线程多消费者负载均衡