PYTHONHISTORY环境变量设置无效,如何关闭Python/IDLE的历史记录功能?
嘿,我来帮你理一理这个问题——你遇到的情况其实挺常见的,先拆解原因,再给你几个可行的解决办法:
首先,为啥你设置PYTHONHISTORY=/dev/null不管用?
这是因为当Python的交互式解释器能用上readline模块的时候(绝大多数类Unix系统的Python都自带这个支持),它会直接忽略PYTHONHISTORY环境变量。这个变量其实是给没有readline可用的场景准备的备用历史机制,而readline模块本身会乖乖用自己的默认配置(比如读取~/.python_history,写完也存回这里),根本不会理你设的PYTHONHISTORY。这就是为啥你明明看到环境变量生效了,但历史记录该读该写一点没耽误的原因。
接下来给你几个实用的解决办法:
一、临时关闭单次Python交互式会话的历史记录
如果你只是想临时开一个无历史的会话,用下面这个命令就行:
python3 -i -c "import readline; readline.clear_history(); readline.set_history_length(0)"
这个命令会启动交互式解释器,同时立刻调用readline接口清空已加载的历史,并且设置历史长度为0——这样新输入的命令也不会被保存下来,完美实现无历史的效果。
或者你也可以写个简单的小脚本(比如叫no_py_history.py),内容如下:
import readline import code # 清除已加载的旧历史 readline.clear_history() # 禁用历史保存,设置长度为0 readline.set_history_length(0) # 启动交互式会话 code.interact(local=globals())
之后每次需要无历史会话时,直接运行python3 no_py_history.py就行。
二、关闭IDLE的历史记录
IDLE的历史机制和Python原生交互式解释器不一样,它不依赖readline,是自己管理历史文件(一般存在~/.idlerc/history-highlight-3.x这样的路径里,x是你的Python版本号)。要关闭它的历史,有两个办法:
- 临时禁用:打开IDLE的交互式窗口后,直接在里面执行这段代码:
这样这次IDLE会话就不会保存任何新命令到历史文件了。import idlelib.history hist = idlelib.history.History() hist.clear() # 清空当前历史 # 替换save方法,让它啥也不做 hist.save = lambda *args, **kwargs: None - 永久禁用的话,你可以找到IDLE的配置文件(在
~/.idlerc/config-main.cfg),打开后找到[History]区块,把save_on_exit改成False,不过要注意不同版本的IDLE配置项可能略有不同。
三、有没有--no-history这样的命令行开关?
很遗憾,Python官方的解释器本身并没有原生的--no-history或者类似的命令行参数,所以只能用上面这些变通的方法来实现。
备注:内容来源于stack exchange,提问作者Melab

