python逐行读取子进程的输出代码
2018-07-20 来源:open-open
python中默认情况下是等待子进程完成之后,一下读取子进程的输出,要想逐行读取,需要自己做一点小技巧。
import sys,os,socket import datetime import fcntl import subprocess from threading import Thread def log_worker(stdout): ''' needs to be in a thread so we can read the stdout w/o blocking ''' username, hostname = os.environ.get('USER'), socket.gethostname() log_file = '/var/log/mysql-%s.log' % username log = open(log_file, 'a') while True: output = non_block_read(stdout).strip() if output: ''' [Tue Oct 30 22:13:13 2012 cseibert@host1]> ''' prompt = '[%(timestamp)s %(username)s@%(host)s]> \n' % dict( timestamp=datetime.datetime.now().strftime('%a %b %d %H:%M:%S %Y'), username=username, host=hostname) print prompt + output log.write(prompt + output + '\n') log.close() def non_block_read(output): ''' even in a thread, a normal read with block until the buffer is full ''' fd = output.fileno() fl = fcntl.fcntl(fd, fcntl.F_GETFL) fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK) try: return output.read() except: return '' if __name__ == '__main__': sub_process = subprocess.Popen( ['sh', '/root/test/dummy.sh'], stdin=sys.stdin, stdout=subprocess.PIPE, stderr=subprocess.PIPE) thread = Thread(target=log_worker, args=[sub_process.stdout]) thread.daemon = True thread.start() sub_process.wait() thread.join(timeout=1)
标签: Mysql
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。
上一篇:ios 获取屏幕的属性和宽度
下一篇:python计算文件的md5值
最新资讯
热门推荐