首页 > 解决方案 > 强制 Python 从命令行更新命令历史文件?

问题描述

Python我通过从 Bash 命令行发出来使用没有 GUI/IDE 的 Python 。我在 Cygwin 环境中使用它,该环境在许多方面表现得像 Linux 系统。

用于 Python 命令行发出的命令历史记录的文件存储在~/.python_history. 我可以使用 vim 的Buffer Explorer轻松搜索和拉取内容以进行操作。也很容易将操作过的内容拖入系统剪贴板,以便在 Python 命令行中粘贴。(另一方面,对于命令的更多战术性修改,我只是使用 readline 来 vim 以前的命令和单行的基础。)

我发现~/.python_history在每个命令之后都不会更新。我不确定它多久更新一次,但很明显退出 Python 会导致它更新。使用 Ctrl+Z 进入后台不会。

(是否有从 Python 命令行强制更新到的快捷方便的方法~/.python_history

自从我最初发布这个问题以来,我有机会将 Linux (Ubuntu) 视为 VirtualBox 虚拟机。但是,启动整个客户机操作系统只是为了能够以调色板的形式访问命令历史记录,而不是使用向上箭头键一次一行(或者等效地,k如果一个人的命令行编辑器是设置为 Vim)。我什至对 Bash 的“修复命令”(fc)命令的 Python 对应物感到满意,即使我必须删除所有我不想执行的行。


各种尝试

根据回复,我尝试 importing readline.write_history_file,但它未被识别,即使它readline本身是:

$python
Python 3.8.10 (default, May 20 2021, 11:41:59) 
[GCC 10.2.0] on cygwin
Type "help", "copyright", "credits" or "license" for more information.

# Show modules
>>> import sys
>>> modulenames = set(sys.modules) & set(globals())
>>> allmodules = [sys.modules[name] for name in modulenames]
>>> print(allmodules)
[<module 'sys' (built-in)>]

# Fail to import readline.write_history_file
>>> import readline.write_history_file as whf 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'readline.write_history_file'; 'readline' is not a package

# However, readline itself imports
>>> import readline
>>> readline.get_history_item(2)
'version'

readline似乎确实是 Cygwin 存储库的一部分,所以我没有尝试pip install readline

事实上,我不愿意尝试在 Cygwin 包管理器之外安装任何东西,pip因为担心会产生不一致。

标签: pythonpython-3.xcommand-history

解决方案


通读这个模块,我发现readline.write_history_file(path)可能是您正在搜索的内容:

将历史列表保存到 readline 历史文件,覆盖任何现有文件。默认文件名是~/.history 交互式解释器中的第一件事,执行

import readline.write_history_file as whf # write history file

然后您可以执行whf()or whf("path/to/.historyfile"),您的 python 历史记录会立即保存到磁盘。

编辑:

我不确定它多久更新一次

它仅在您退出解释器时更新。如果你杀死它,历史将不会被保存,Ctrl+Z只会导致解释器被暂停。如果您随后取消暂停它(例如通过执行fgor bg)并正常退出它,历史文件将被写入。


推荐阅读