如何使用Python访问命令提示符历史记录

3
在Windows 10上的Python 3.6中,假设我打开了一个命令提示符会话(不是Python命令提示符或Python交互式会话)并且我一直在设置环境,进行许多配置等操作。是否有办法使用Python模块访问我在该会话中使用的命令历史记录呢?理想情况下,我希望能够将此历史记录导出到文件中,以便将来重复使用。 示例: 在命令提示符中键入:python savecmd.py,它将保存该会话的历史记录。

2
Windows 还是 *nix?你提到了 cmd,所以我猜是指 Windows? - PressingOnAlways
@cᴏʟᴅsᴘᴇᴇᴅ 我指的不是Python的交互式命令提示符或Python解释器。 - Jonathan Porter
@JonathanPorter 如果你在*Nix上,你可以执行history = open('/home/.bash_history').readlines(),然后你就可以从那里获取所有的历史记录。问题是,我不确定你如何将其限制为当前会话。 - cs95
对于那些希望进一步了解如何使用Python获取编辑历史的人来说,这是一个类似的问题:https://stackoverflow.com/questions/53518255/print-bash-history-using-python - Josiah Yoder
2个回答

3
你完全不需要使用Python,可以使用 doskey 来实现,例如:
doskey /history

将打印出当前会话的命令历史记录,如果需要保存,可以将其重定向到文件中:

doskey /history > saved_commands.txt

如果你真的想在Python内部完成这个任务,你可以使用subprocess.check_output()来捕获命令历史记录,并将其保存到文件中:

import subprocess

cmd_history = subprocess.check_output(["doskey", "/history"])
with open("saved_commands.txt", "wb") as f:
    f.write(cmd_history)

1
你可以使用Python的ctypes来完成这个任务,而无需使用doskey.exe。而且更好的是,你可以使用Unicode而不是控制台代码页(如果它不是当前代码页中的字符,则可能会导致信息丢失)。然而,由于微软从未记录过doskey.exe调用的控制台函数GetConsoleCommandHistoryLengthWGetConsoleCommandHistoryW,因此不支持这种方法。 - Eryk Sun
似乎已从ctypes中删除。我使用:for i in list(range(readline.get_current_history_length())): print(readline.get_history_item(i)) - not2qubit

0

实际上,您在这里要求三件不同的事情。

  1. 获取Python REPL命令历史记录
  2. 从“提示符”中获取信息,我假设这是Powershell或CMD.exe。
  3. 将历史记录列表保存到文件中。

要从REPL内部获取历史记录,请使用:

for i in list(range(readline.get_current_history_length())): print(readline.get_history_item(i))

很遗憾,在REPL中没有历史记录,当从外部使用时,就像上面一样,所以您需要找到历史文件并打印它。

要从powershell中查看历史文件:

function see_my_py_history{ cat C:\<path-to>\saved_commands.txt }

Set-Alias -Name seehist -Value see_my_py_history

@user2153235 不,对于Windows上的Python,有pyreadline3。然而,在那个版本中存在一些遗留的问题和PR,这些问题从未被修复/合并,所以我正在使用这里的分支,据我所知,这个分支也没有被合并/修复到pyreadline3中。 - not2qubit
我只是开始了解Python和Conda,所以我觉得不够熟练,无法偏离 conda install pyreadline3。到目前为止,来自pyreadline.BaseReadline.write_history_file的文件大小为0字节(详细信息在这里)。 - user2153235
我已经将我的尝试和困难作为独立的问题发布这里 - user2153235
@user2153235 Conda是在Python包管理非常不稳定且平台/编译支持不可靠的时候创建的。我强烈建议将来和日常开发中避免使用Conda。现在有更好的包管理工具,如poetry等,与pip兼容。 - not2qubit
我明白你的意思,但是我觉得这个选项对我来说目前不太现实。作为一个新手,我需要与团队和组织的做事方式保持一致,同时也要与那位更资深的人保持一致,我希望在我具备一定功能能力之后能够支持他(这应该是去年就应该做到的)。话虽如此,我不确定Conda在命令历史文件问题中有多重要。可以肯定的是,大多数集成开发环境(例如Anaconda中分发的Spyder)都会提供用户历史记录的方法,所以根本问题可能是在没有使用集成开发环境的情况下使用Python。 - user2153235
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接