如何将linux命令输出重定向到日志记录

时间:2016-11-10 17:05:45

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

我知道这是一个非常简单的问题,但我无法做出因为我是python的新手

我有一个shell脚本,当你执行onlinux shell时会生成输出 通常它需要30-40分钟才能完成脚本。 我在我的python代码中使用该脚本。 当我执行我的python脚本(比如说abc.py)时,输出应该立即重定向到日志,也应该打印在屏幕上。

EX:test.sh是shell脚本,abc.py是我的python脚本。 我可以将test.sh的完整输出重定向到日志记录,如下所示

import logging
import commands
logging,basicConfig(filename=abc.log,filemode='w',level=logging.INFO)
print ("logging started")
status,output=commands.getstatusoutput(./test.sh)
logging.INFO(output)   

但这有两个缺点: 1)我必须等到test.sh完成才能查看abc.log文件中的输出但我想立即从abc.log查看输出 2)即使我不能立即在屏幕上查看输出,这里我也要等待它完成。

你能指导一种更好的方式来实现我的目标吗?

2 个答案:

答案 0 :(得分:0)

正如评论中所提到的,Sub check() Dim temp As Integer With Sheets("Sheet1") temp = 0 For j = 18 To 29 For i = 2 To 39 If .Cells(i, j).Value = "BLOCKED" Then temp = temp + 1 End If Next Next MsgBox temp & " cell" & IIf(temp = 1, "", "s") & " in entire area " & IIf(temp = 1, " is", " are") & " 'BLOCKED'" End With End Sub 模块更适合这种情况。您必须通过管道读取数据,然后打印日志并打印出来。

这是一个有效的例子:

subprocess

代码会从字符串末尾删除import logging import subprocess logging.basicConfig(filename='abc.log', filemode='w', level=logging.INFO) print("logging started") popen = subprocess.Popen('./script.sh', stdout=subprocess.PIPE) for line in (s.strip('\n').strip('\r') for s in iter(popen.stdout.readline, "")): logging.info(line) print line \r字符,以便它们不会在日志或输出中结束。

答案 1 :(得分:0)

您可以创建类似假文件的系统

class StdoutLogger(object):
"""
 Fake file-like stream object that redirects writes to a logger instance.
"""
   def __init__(self, logger):
       self.logger = logger
   def write(self, buf):
       self.logger.info(buf.strip())
   def flush(self):
       pass

现在将stdout重定向到我们的假文件系统

logger =  logging.getLogger('stdoutlogger')
sys.stdout = StdoutLogger(logger)

现在,即使您的脚本没有完全执行(即使在进行中),您也可以逐行阅读。