Zac*_*aun 7 python logging python-3.x
我想实时访问解释器输入和错误以及标准输出.优选地,该信息将被写入文件,以便在输入每个解释器命令之后我可以轮询文件以进行更改.例如,给定一个解释器会话:
>>> 5 * 7
35
>>> print("Hello, world!")
Hello, world!
>>> "Hello, world!"
'Hello, world!'
Run Code Online (Sandbox Code Playgroud)
我想在日志文件中看到以下内容:
> 5 * 7
35
> print("Hello, world!")
Hello, world!
> "Hello, world!"
'Hello, world!'
Run Code Online (Sandbox Code Playgroud)
格式化并不重要; 重要的是我可以在文件中搜索关键词以在会话期间触发交互事件.
到目前为止我学到了什么:
Python的code
模块允许我创建一个InteractiveConsole
对象,raw_input
我可以重新定义该方法以记录到文件,如下所示:
import code
class LoggedConsole(code.InteractiveConsole):
def __init__(self, locals):
super(LoggedConsole, self).__init__(locals)
self.file = open('consolelog.dat', 'a')
def __del__(self):
self.file.close()
def raw_input(self, prompt=""):
data = input(prompt)
self.file.write(data+'\n')
return data
Run Code Online (Sandbox Code Playgroud)
此外,InteractiveConsole
使用内置write
方法记录错误,我可以重新定义:
def write(self, data):
sys.stderr.write(data)
self.file.write(data+'\n')
Run Code Online (Sandbox Code Playgroud)
我还了解到以下片段将记录所有标准输出:
class Tee(object):
def __init__(self):
self.file = open('consolelog.dat', 'a')
self.stdout = sys.stdout
def __del__(self):
sys.stdout = self.stdout
self.file.close()
def write(self, data):
self.file.write(data)
self.stdout.write(data)
sys.stdout = Tee()
Run Code Online (Sandbox Code Playgroud)
我(破碎)尝试将这些全部组合在一起就是创建一个LoggedConsole
对象,并将其传递给Tee
当地人.
console = LoggedConsole(locals={sys.stdout:LoggedExec()})
console.interact()
Run Code Online (Sandbox Code Playgroud)
(我之前没有通过当地人,所以也许我在这里做错了,但我没有收到错误.)
无论如何,这将打开一个新的交互式控制台,并将记录(关闭后)所有输入和错误,但不会输出.我一直在用这种方式撞击这个,我觉得我很接近,但也许不是.
此外,在会话期间是否有办法解决所有这些问题?目前,所有日志记录都会在会话关闭后进行.
谢谢你的时间,对不起文字的墙.
编辑:我希望能够在标准Python解释器中实现这一目的,以实现可移植性.
edit2:Jaime的代码片段非常适合记录我需要的所有内容.但是,无论如何,我可以让它实时完成,而不是等待会话结束?
edit3:想 出来:).最后的工作片段:
import code
import sys
class Tee(object):
def __init__(self, log_fname, mode='a'):
self.log = open(log_fname, mode)
def __del__(self):
# Restore sin, so, se
sys.stdout = sys.__stdout__
sys.stdir = sys.__stdin__
sys.stderr = sys.__stderr__
self.log.close()
def write(self, data):
self.log.write(data)
self.log.flush()
sys.__stdout__.write(data)
sys.__stdout__.flush()
def readline(self):
s = sys.__stdin__.readline()
sys.__stdin__.flush()
self.log.write(s)
self.log.flush()
return s
def flush(foo):
return
sys.stdout = sys.stderr = sys.stdin = Tee('consolelog.dat', 'w')
console = code.InteractiveConsole()
console.interact()
Run Code Online (Sandbox Code Playgroud)
我只在python2.7中测试过这个.我没有3个方便.
import code
import sys
class Tee(object):
def __init__(self, log_fname, mode='a'):
self.log = open(log_fname, mode)
def __del__(self):
# Restore sin, so, se
sys.stdout = sys.__stdout__
sys.stdir = sys.__stdin__
sys.stderr = sys.__stderr__
self.log.close()
def write(self, data):
self.log.write(data)
sys.__stdout__.write(data)
def readline(self):
s = sys.__stdin__.readline()
self.log.write(s)
return s
# Tie the ins and outs to Tee.
sys.stdout = sys.stderr = sys.stdin = Tee('consolelog.dat', 'w')
console = code.InteractiveConsole()
console.interact()
Run Code Online (Sandbox Code Playgroud)
看看IPython(我自己没有用过它).以下是文档中可能特别感兴趣的部分:http://ipython.org/ipython-doc/dev/interactive/reference.html#session-logging-and-restoring