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值
最新资讯
热门推荐