Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中启动进程并使用PID重用_Python_Multithreading_Subprocess_Executable - Fatal编程技术网

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

在python中启动进程并使用PID重用,python,multithreading,subprocess,executable,Python,Multithreading,Subprocess,Executable,我的主进程/线程启动一个可执行文件,在回显加载的算法后开始等待信号。我正在使用subprocess.Popen类来运行可执行文件。 稍后,将启动一个线程,该线程将向先前启动的可执行文件发送信号。但我不知道如何从该线程向该特定子进程发送信号。 是否可以使用PID传递PID和“恢复”子流程?重用该进程的目的是发送与stdin等效的内容 以下是启动可执行文件的代码: def start_module(): cmd = '%s/libraries/OpenBR' % settings.MODU

我的主进程/线程启动一个可执行文件,在回显加载的
算法后开始等待信号。我正在使用
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\u模块
函数返回进程,您可以稍后使用
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
不一定会终止进程:它会向进程发送一个信号,然后该进程可以适当地处理该信号(这里是一个
报警
信号)


如果您的目的是将一些输入传递给流程的
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?好吧,我想我成功了。但是现在我在读取
stdin
的输出时遇到了问题。我尝试了以下方法:
process.stdin.write(image\u directory)print process.stdout.readline()
,但线程只是停留在打印上,没有打印任何内容。我不想结束这个过程。我只想在给出
图像\u控制器
后输出。我需要稍后能够使用另一个
image\u目录再次写入
stdin
,并从中检索结果。我找到了我上一个问题的答案,我结合了以下内容:虽然,我只从stdout中获得第一行。。。有什么线索吗?