【问题标题】:Flushing out data from Popen buffer从 Popen 缓冲区中清除数据
【发布时间】:2014-01-17 15:04:41
【问题描述】:

我正在编写一个 python 脚本,该脚本通过拖尾文件读取数据,然后放入不同的文件。该脚本以时间限制的方式工作,并最终在到达 ENDTIME 时从缓冲区中清除数据。但是,源文件和目标文件的大小不匹配。

下面是一个sn-p:

    self.read_size = 2048
    self.tail_buffer = 2048

    # start the file tail
    cmd = '%s -f -o %s %s' % (self.jtailcmd, offset, self.source_journal)
    self.logger.debug('[%s] starting FILE Tail' % self.getName())
    try:
        self.jtail = popen2.Popen3(cmd, bufsize = self.tail_buffer)
        self.jtail.tochild.close()
        out = self.jtail.fromchild
        outfd = self.jtail.fromchild.fileno()
        flags = fcntl.fcntl(outfd, fcntl.F_GETFL)
        fcntl.fcntl(outfd, fcntl.F_SETFL, flags | os.O_NONBLOCK)
    except:
        message = '[%s] error reading file' % self.getName()
        self.logger.error(message)
        self.logger.error('[%s] %s: %s' % \
            (self.getName(), sys.exc_info()[0], sys.exc_info()[1]))
        send_alert('AE', message)
        self.sleep(60)
        self.close_tail()
        self.close_ssh()

然后最终它会刷新数据:

        try:
            [i, o, e] = select.select([outfd], [], [], 1)
            if i:
                data = out.read(self.read_size)
            else:
                data = None
        except:
            message = '[%s] error reading file' % self.getName()
            self.logger.error(message)
            self.logger.error('[%s] %s: %s' % \
                (self.getName(), sys.exc_info()[0], sys.exc_info()[1]))
            send_alert('AE', message)
            self.close_tail()
            self.close_ssh()
            self.sleep(60)
            break
        if data:
            if self.sshcat.poll() != -1:
                self.logger.error('[%s] connection error' % self.getName())
                self.close_tail()
                self.close_ssh()
                break
            try:
                self.sshcat.tochild.writelines(data)
                self.sshcat.tochild.flush()
            except:
                message = '[%s] error writing remote file' % self.getName()

在进行故障排除时,我将问题范围缩小到tail_buffer 大小!通过减小 tail_buffer 大小,脚本运行良好。

我不想依赖tail_buffer 的大小。理想情况下,脚本应该独立于它!

有没有办法从 POPEN 缓冲区刷新数据?

请帮忙!

【问题讨论】:

  • 如果你减少了tail_buffer并且代码开始正常工作,那么剩下的问题是什么?
  • 我不想依赖tail_buffer的大小。基本上脚本应该独立于它!
  • 有没有更高效的方式从文件中读取数据?
  • 您是否尝试过在这一行将 bufsize 设置为 0:self.jtail = popen2.Popen3(cmd, bufsize = self.tail_buffer)?如果不指定,bufsize 默认为 0。听起来该命令可能正在等待缓冲区在返回之前被填充。这可以解释为什么当您使用较小的缓冲区时它会更快地返回。

标签: python python-2.7 python-3.x popen python-2.x


【解决方案1】:

如果我正确理解您的问题,您可能会考虑采用与此问题类似的方法:Reading from a frequently updated file

使用 tail 有点小技巧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2012-10-12
    • 1970-01-01
    • 2016-08-18
    • 2021-03-02
    相关资源
    最近更新 更多