gpt4 book ai didi

python - 如何记录 Python 交互式 shell session 中发生的一切?

转载 作者:太空狗 更新时间:2023-10-29 21:19:00 25 4
gpt4 key购买 nike

我想实时访问解释器输入和错误以及标准输出。最好将此信息写入一个文件,这样我就可以在输入每个解释器命令后轮询文件的更改。例如,给定一个解释器 session :

>>> 5 * 7
35
>>> print("Hello, world!")
Hello, world!
>>> "Hello, world!"
'Hello, world!'

我想在日志文件中看到以下内容:

> 5 * 7
35
> print("Hello, world!")
Hello, world!
> "Hello, world!"
'Hello, world!'

格式并不重要;重要的是我可以在文件中搜索关键字以在 session 期间触发交互事件。

到目前为止,我在尝试完成此任务时学到了什么:

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

此外,InteractiveConsole 使用内置的 write 方法来记录错误,我可以将其重新定义为:

def write(self, data):
sys.stderr.write(data)
self.file.write(data+'\n')

我还了解到以下代码片段将记录所有标准输出:

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()

我(失败的)尝试将这一切结合在一起,然后创建一个 LoggedConsole 对象,并在本地传递给它 Tee

console = LoggedConsole(locals={sys.stdout:LoggedExec()})
console.interact()

(我之前没有通过本地人,所以也许我在这里做错了,但我没有收到错误。)

无论如何,这将打开一个新的交互式控制台,并将记录(关闭后)所有输入和错误,但不记录输出。一段时间以来,我一直在努力解决这个问题,我觉得自己很接近,但也许还差得远。

此外,是否有办法让所有这些都发生在 session 期间?目前,所有日志记录都在 session 关闭后发生。

感谢您的宝贵时间,对于文字墙感到抱歉。

编辑:出于可移植性目的,我希望能够在标准 Python 解释器中完成此操作。

编辑2:Jaime 的代码片段非常适合记录我需要的一切。不过,有什么办法可以让它实时执行此操作,而不是等待 session 关闭?

编辑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)
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()

最佳答案

我只在 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()

关于python - 如何记录 Python 交互式 shell session 中发生的一切?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8053900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com