我在我们的部署脚本包装器中考虑pexpect
(完全开放替代方案,如果有更好的方法我不知道) - 但我需要一种方法来阅读实时输出,不仅在我们点击EOF
之后。由于这是一个用于所有环境的部署包,因此我们需要在问题发生时尽快发现问题(如果情况非常糟糕,可能会遇到紧急情况)。
我可以使用这样的东西吗?理想情况下,我想使用我们现有的记录器..
def SetupLogging():
# the logger
# set to DEBUG since the reports should already give
# any information we're looking for at a glance
global log
log = logging.getLogger('ansiwrap')
log.setLevel(logging.DEBUG)
# create file handler which logs everything
fh = logging.FileHandler('ansiwrap.debug', mode='w')
fh.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
# create formatter and add it to the handlers
formatter = logging.Formatter('[%(asctime)s] | %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# add the handlers to logger
log.addHandler(ch)
log.addHandler(fh)
为了完整起见,这是一个示例实现,但对我来说似乎很笨:
child = pexpect.spawn(cmd)
while True:
try:
child.expect('\n')
print(child.before)
except pexpect.EOF:
break
答案 0 :(得分:0)
EOF
被命中。要获得正在发送的命令和接收的回复的实时输出,您可以将输出记录到stdout或文件。
Pexpect的Spawn类有一个logfile_read属性,它将子进程的输出写入指定的文件。 修改如下所示的代码将完成这项工作。我正在使用sys.stdout,它会将所有内容打印到控制台。您可以打开文件并使用它
child = pexpect.spawn(cmd)
child.logfile_read = sys.stdout
while True:
try:
child.expect('\n')
print(child.after)
except pexpect.EOF:
break
仍需要while
块的原因是因为根据文档日志文件在每次写入后都会刷新。由于写入不存在,对expect的调用将导致刷新文件。