加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python逐行读取子进程的输出代码

发布时间:2020-12-17 17:12:07 所属栏目:Python 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 import sys,os,socketimport datetimeimport fcntlimport subprocessfrom threading import Threaddef log_worker(stdout): ''' needs to be in a thr

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

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 [email?protected]]> '''
            prompt = '[%(timestamp)s %(username)[email?protected]%(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)

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读