subprocess子进程的杀死
来源:互联网 发布:java ee插件下载 编辑:程序博客网 时间:2024/05/11 03:17
业务中,python代码需要调用C++程序,获取C++程序执行结果。使用了python的subprocess模块的call调用C++程序。
由于C++程序存在问题,在subprocess.call()中,程序一直没返回,那么python程序就会卡在这里。现在想做以下处理:
(1)如果C++程序调用成功,就直接返回;
(2)如果C++程序卡住,就等待,如果在特定的时间内还没有返回,就杀掉C++程序。
先上代码:
#!/usr/bin/env python# -*- encoding: utf-8 -*-import sysimport subprocessimport timefrom threading import Threaddef GetOcrResult(filepath, return_state): #str_cmd = "export LD_LIBRARY_PATH=/data/sync360/OcrProcess/bin/:$LD_LIBRARY_PAT && convert %s %s.jpg && cd /data/sync360/OcrProcess/bin && /data/sync360/OcrProcess/bin/OcrReg %s.jpg %s.out" % (filepath, filepath, filepath, filepath) convert_str_cmd = "convert %s %s.jpg" %(filepath, filepath) subprocess.call(convert_str_cmd, shell=True) str_cmd = "/data/sync360/OcrProcess/bin/OcrReg %s.jpg %s.out" % (filepath, filepath) new_process = subprocess.Popen(str_cmd, shell=True, cwd="/data/sync360/OcrProcess/bin", env={'LD_LIBRARY_PATH':'/data/sync360/OcrProcess/bin/:$LD_LIBRARY_PAT'}) pid = new_process.pid return_state['pid'] = pid #print pid response = new_process.wait() if response != None: return_state['response'] = responsedef MainFun(filepath): return_state = {} t = Thread(target=GetOcrResult, args=(filepath, return_state, )) #t.setDaemon(True) t.start() t.join(15) if 'response' in return_state: return return_state['response'] else: pid = return_state['pid'] str_cmd = "kill %s" %(pid) subprocess.call(str_cmd, shell=True) return -1if __name__ == '__main__': #path = '/data/sync360/OcrProcess/bin/1' path = '/data/sync360/OcrProcess/bin/UPLOAD_cmq7xfPP9FQHnzG1c8y07gacVyNOmHZ9' state = MainFun(path) print state# vim: set expandtab sw=4 ts=4 sts=4:
(1)首先看在MainFun函数中,我们创建了一个线程,让这个线程去调用C++模块。其中t.join(15)是其中的关键:它要求主线程等待子线程的时间,如果子线程在等待的时间没有完成,主线程就不在等待,继续执行下面的代码。参考http://www.cnblogs.com/vingi/articles/2657790.html。
(2)通过上面的设置,主线程就不会被子线程卡住。但我们需要把卡住的子线程杀死,由于子线程中通过subprocess启动了进程,所以需要得到进程的pid:pid = new_process.pid。然后通过一个词典的数据结构告诉主线程。subprocess中的参数参考http://blog.chinaunix.net/uid-26990529-id-3390814.html
(3)在主线程中,通过检查词典的结构,来判断C++进程摸是否被卡住:如果被卡住了,就通过pid杀死。
0 0
- subprocess子进程的杀死
- subprocess.popen.kill杀死所有子进程
- python 启动进程,杀死 subprocess
- subprocess监控子进程的脚本执行
- python 子进程subprocess
- 子进程模块subprocess
- python安全管理子进程-subprocess
- Python 子进程 (subprocess包)
- Python子进程 subprocess模块
- python安全管理子进程-subprocess
- Python子进程 (subprocess包)
- python子进程模块:subprocess
- python中的subprocess子进程
- 在windows下面关闭subprocess打开的子进程
- Python的subprocess子进程和管道进行交互
- Python的subprocess子进程和管道进行交互
- Python的subprocess子进程和管道进行交互
- Python标准库 子进程 (subprocess包) 的说明
- 黑马程序员_12_高新技术之反射
- Java NIO系列教程(十一) Pipe
- Java NIO系列教程(十二) Java NIO与IO
- POJ 1159--Palindrome(回文序列)
- Codeforces Round #250 (Div. 2) -B. The Child and Set
- subprocess子进程的杀死
- NYOJ 269--VF
- 我的《C陷阱与缺陷》读书笔记
- CentOS操作杂记
- C语言:位异或运算符
- COCOS2DX之类型强制转换~(亦为C++)
- strings命令
- cal
- C语言基础——指针