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