我知道这是一个非常简单的问题,但我无法做出因为我是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)即使我不能立即在屏幕上查看输出,这里我也要等待它完成。
你能指导一种更好的方式来实现我的目标吗?
答案 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)
现在,即使您的脚本没有完全执行(即使在进行中),您也可以逐行阅读。