Python:如何修复此损坏的管道错误?

时间:2015-01-25 09:21:43

标签: python linux pipe ubuntu-14.04

我想将tac命令显示的行数限制为5,并将此结果保存到新文件中。

tac /home/pi/log/log.txt | head -n 5 

上面的命令在我的命令窗口中运行良好... 但是,当我尝试通过Python文件调用它然后保存在新文件中时,我收到tac: write error: Broken pipe错误...

这就是代码的样子:

while True:
    db_file = open("/home/pi/log/heartbeat.txt", 'a')
    db_file.write('#################\n')
    db_file.write('LAST LOGs\n')
    db_file.write('#################\n')           
    db_file.close()

    statement = 'tac /home/pi/log/log.txt | head -n 5 '
    result = check_output(statement, shell=True)
    db_file = open("/home/pi/log/heartbeat.txt", 'a')
    db_file.write(result)
    db_file.close()
    sleep(1)

顺便说一下,我每秒都使用命令watch继续检查新内容。

有关如何修复此问题的任何提示?

谢谢,

2 个答案:

答案 0 :(得分:1)

您可以使用此调节功能将此错误解决为您的语句命令:

更改自:

statement = 'tac /home/pi/log/log.txt | head -n 5 '

更改为:

statement = 'tail -n5 /home/pi/log/log.txt | tac | head -n 5 '

此外,该声明可以缩短为:

statement = 'tail -n5 /home/pi/log/log.txt | tac'

发生错误的原因是(并且只会在某些环境中显示,例如您的直接python环境),在缓冲区读取周期期间触发停止读取的限制。它不会发生在较小的文件上,因为在触发器关闭tac命令之前会读取内容。

错误并非致命......只是一种麻烦。它可以忽略,也可以使用提供的解决方法。

答案 1 :(得分:-1)

我认为tac在大输入上会有效,所以也许最好将命令更改为:

tail -n5 /home/pi/log/log.txt | tac 

(在python环境中处理大型日志文件时tac会崩溃并导致管道错误吗?)