首页 > 编程问答 >带时间戳的 Python 命令行历史记录

带时间戳的 Python 命令行历史记录

时间:2024-07-21 10:58:16浏览次数:9  
标签:python logging command-line timestamp interactive

有没有办法记录每个命令的时间?例如,挂钩交互式 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

这段代码做的是:

  1. 定义 custom_displayhook(value) 函数:
  2. 检查 value 是否为 None 。如果不是,则表示有一个命令被执行并产生了输出。
  3. 获取当前时间并使用 strftime() 格式化为字符串。
  4. 使用 sys.__stdout__.getvalue() 获取执行的命令并使用 strip() 去除多余的空格。
  5. 打开 ~/.python_history_timestamps 文件(如果不存在则创建),以追加模式打开。
  6. 使用 f-string 格式化时间戳和命令,并将它们写入文件。
  7. 调用 sys.__displayhook__(value) 以确保原始的输出功能仍然有效。

  8. 设置自定义的 displayhook:

  9. sys.displayhook = custom_displayhook 用我们自定义的函数替换默认的 displayhook

为了使用此功能,请将其添加到你的 Python 启动文件中,例如 ~/.pythonrc ,以便在每次启动交互式 Python 会话时加载。

现在,每次执行命令并产生输出时,带有时间戳的命令都将被追加到 ~/.python_history_timestamps 文件中。

注意: 此方法只会记录产生输出的命令。没有输出的命令,例如赋值操作,将不会被记录。

标签:python,logging,command-line,timestamp,interactive
From: 78774294

相关文章

  • 在 python3 中迭代字典键时无法删除它:“RuntimeError:字典在迭代期间更改了大小”
    我试图在迭代字典时从字典中删除一个键。从字典中删除键时,我得到:RuntimeError:dictionarychangedsizeduringiteration我的代码:mydict={'one':1,'two':2,'three':3,'four':4}fork,vinmydict.items():ifk=='two'......
  • Python pyTelegramBotAPI:设置不受循环影响的变量
    我想创建一个基本上是布尔值的变量(无论机器人是否工作)。但是,当使用TeleBot.polling()时,脚本开始无限循环,所以如果我在代码开头设置一个变量就像:is_bot_working=True,变量将始终为真,反之亦然。那么,我应该如何设置一个不受循环影响的变量?这就是代码:impor......
  • 编解码器无法解码位置 2-3 中的字节:截断的 \UXXXXXXXX 转义 (Python QREADER)
    我正在尝试pythonqreader模块,但每次我尝试运行它时,我都会收到SyntaxError:(unicodeerror)'unicodeescape'codeccan'tDecodebytesinposition2-3:truncated\UXXXXXXXXescapeerror.fromqreaderimportQReaderfromcv2importQRCodeDetector,imreadfrompyz......
  • Python 工程师对 3D 高斯溅射的介绍(第 1 部分)
    从Python工程师的角度理解和编写GaussianSplatting欢迎来到雲闪世界。2023年初,来自法国蔚蓝海岸大学和马克斯普朗克信息研究所的作者发表了一篇题为“用于实时场渲染的3D高斯溅射”的论文。¹该论文展示了实时神经渲染的重大进步,超越了NeRF等先前方法的实用性。²......
  • 使用Python读取PDF文件,部分内容显示为一串乱码。我应该如何恢复它?
    使用Python读取PDF文件,部分内容显示为一串乱码。我该如何恢复它?importfitzdoc=fitz.open("2303.11366v4.pdf")#downloadfromhttps://arxiv.org/pdf/2303.11366print(doc[2].get_text().split('Figure1')[0])我得到了这样的文字:<RXDUHLQWKHPLGGOHRIDURRP>@7DVN......
  • Python 迭代列表
    分配sum_extra给定列表test_grades收到的额外学分总额。满分是100分,所以超过100分都是额外分。对于给定程序,sum_extra是8,因为1+0+7+0是8。给定程序的示例输出:额外总和:8请原谅我,我是编码新手,而且真的很糟糕!这是我的代码(不起作用)请......
  • 计算机毕业设计Python+Spark新能源汽车推荐系统 汽车大数据 汽车数据分析 汽车可视化
    表2黄河交通学院本科毕业设计(论文)开题报告学生姓名刘丹杰专业班级20本大数据一班学号2080910T01521设计(论文)题目基于Hadoop的新能源汽车销售数据分析系统的设计与实现选题的目的和意义:选题目的:新能源汽车销售数据分析系统的设计与实现旨在利用Hadoop等大数......
  • 为什么我的 python 程序一直说没有名为“PIL”的模块?
    我正在pythonIDLEshell中工作,由于某种原因pyautogui.locateOnScreen将无法工作。这是我的代码:frompyautoguiimport*importpyscreezeimportpyautoguiimporttimeimportkeyboardimportrandomimportwin32api,win32conwhile1:ifpyautogui.locateOnS......
  • 我在 Python 时间格式化函数中遇到代码问题
    我一直在研究一个Python函数,将给定的秒数转换为可读的时间格式(HH:MM:SS)。该函数对于大多数测试用例都能正常工作,但对于一些特定的输入会失败。这是我编写的函数:defmake_readable(seconds):ifseconds<60:s1=secondsh1,m1=(0,0)return......
  • 《流畅的Python》第二版 第11章
     fromarrayimportarrayimportmathclassVector2d:__match_args__=('x','y')typecode='d'def__init__(self,x,y):self.__x=float(x)self.__y=float(y)@propertydefx(self)......