有没有办法记录每个命令的时间?例如,挂钩交互式 shell,以便它将相同的内容写入
~/.python_history
到
~/.python_history_timestamps
但带有时间戳?
我正在跟踪我白天所做的事情并将其放入我的日历中。
为了帮助回溯,我使用了 firefox 历史记录、Dropbox 活动、一个 vim 自动命令,将所有已保存文件的所有时间戳写入
~/.vimsavelog
,但如果我花 2 小时在 python 交互中做一些事情,我很容易在一天结束时结束不知道那两个小时我做了什么。
我什至想让内核/文件系统记录“下载”文件夹中的所有文件保存,但这是另一个问题。
或者是否有更好的方法来实现这种日志?理想情况下,我希望精度降至 15 分钟。
我知道
~/.python_history
、
readline
和
ipython
的
%history -g
,但我不知道是否以及如何添加时间戳。我看到
readline.set_pre_input_hook
但我不太清楚它的作用或工作原理,因为它说钩子是在没有输入的情况下调用的。
你可以通过创建一个自定义输出函数来包装
sys.displayhook
来实现这一点,该函数会将带有时间戳的历史记录写入你的文件中。下面是如何做到这一点:
import sys
import datetime
def custom_displayhook(value):
if value is not None:
# 获取当前时间并格式化
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 获取执行的命令(不带时间戳)
command = sys.__stdout__.getvalue().strip()
# 将时间戳和命令写入历史记录文件
with open(f"{os.path.expanduser('~')}/.python_history_timestamps", "a") as f:
f.write(f"[{timestamp}] {command}\n")
# 执行默认的 displayhook 行为以显示输出
sys.__displayhook__(value)
# 设置自定义的 displayhook
sys.displayhook = custom_displayhook
这段代码做的是:
-
定义
custom_displayhook(value)
函数: -
检查
value
是否为None
。如果不是,则表示有一个命令被执行并产生了输出。 -
获取当前时间并使用
strftime()
格式化为字符串。 -
使用
sys.__stdout__.getvalue()
获取执行的命令并使用strip()
去除多余的空格。 -
打开
~/.python_history_timestamps
文件(如果不存在则创建),以追加模式打开。 -
使用
f-string
格式化时间戳和命令,并将它们写入文件。 -
调用
sys.__displayhook__(value)
以确保原始的输出功能仍然有效。 -
设置自定义的 displayhook:
-
sys.displayhook = custom_displayhook
用我们自定义的函数替换默认的displayhook
。
为了使用此功能,请将其添加到你的 Python 启动文件中,例如
~/.pythonrc
,以便在每次启动交互式 Python 会话时加载。
现在,每次执行命令并产生输出时,带有时间戳的命令都将被追加到
~/.python_history_timestamps
文件中。
注意: 此方法只会记录产生输出的命令。没有输出的命令,例如赋值操作,将不会被记录。
标签:python,logging,command-line,timestamp,interactive From: 78774294