如何避免在ipython历史记录中存储命令?
在bash中,我可以通过在命令前面加一个空格来防止命令保存到bash历史记录中。我无法在ipython中使用此方法。我该如何在ipython中做同样的事情?我想我终于明白了。这种方法并不是真的“阻止”ipython记录历史,而是实际上删除历史记录。但我认为这仍然是实现这一目标的好方法 ipython历史记录存储在如何避免在ipython历史记录中存储命令?,python,ipython,history,Python,Ipython,History,在bash中,我可以通过在命令前面加一个空格来防止命令保存到bash历史记录中。我无法在ipython中使用此方法。我该如何在ipython中做同样的事情?我想我终于明白了。这种方法并不是真的“阻止”ipython记录历史,而是实际上删除历史记录。但我认为这仍然是实现这一目标的好方法 ipython历史记录存储在$(ipython locate)/profile\u default/history.sqlite中的sqlite数据库中 数据库表History有四列:session、line、so
$(ipython locate)/profile\u default/history.sqlite
中的sqlite数据库中
数据库表History有四列:session、line、source和source\u raw。session列显示当前会话的session\u id
,可以使用ipython中的方法获取它:get\u ipython().hisdb.get\u last\u session\u id()
。行列就是行数
因此,我要做的是在ipython
environment中删除数据库中的该记录:
1) 可以使用ipython中的get\u ipython().history\u manager.db
获取历史数据库对象
hismgr = get_ipython().history_manager
2) 获取会话id:
session_id = hismgr.get_last_session_id()
3) 删除带有行id
(此处假设为111)和会话id
hismgr.db.execute('DELETE FROM history WHERE line={0} and session={1}'.format(111, session_id))
4) In
和Out
数组列表也类似于历史,但它存储在内存中,因此可以像变量一样进行扫描或重写
In[111]=Out[111]=''
“防止命令保存到ipython历史记录”是指删除数据库中行的历史记录并在ipython环境中重写in和Out数组。我们可以把这四条线合并成一条线,一次完成这项工作如果要删除第128行,下面是一个示例:
In [127]: history -l 3 -n
124: history -l 3 -n
125: hismgr = get_ipython().history_manager; session_id = hismgr.get_last_session_id();hismgr.db.execute('DELETE FROM history WHERE line={0} and session={1}'.format(123, session_id))
126: history -l 3 -n
In [128]: passwd='123456'
In [129]: hismgr = get_ipython().history_manager; session_id = hismgr.get_last_session_id();hismgr.db.execute('DELETE FROM history WHERE line={0} and session={1}'.format(128, session_id));In[128]=Out[128]='';
Out[129]: <sqlite3.Cursor at 0x7f8dce3dae30>
In [130]: history -l 3 -n
126: history -l 3 -n
127: history -l 3 -n
129: hismgr = get_ipython().history_manager; session_id = hismgr.get_last_session_id();hismgr.db.execute('DELETE FROM history WHERE line={0} and session={1}'.format(128, session_id));In[128]=Out[128]='';
[127]中的history-l3-n
124:历史-l 3-n
125:hismgr=get\u ipython().history\u manager;session_id=hismgr.get_last_session_id();execute('DELETE FROM history WHERE line={0}和session={1}'。格式(123,session_id))
126:历史-l 3-n
In[128]:passwd='123456'
在[129]中:hismgr=get\u ipython().history\u manager;session_id=hismgr.get_last_session_id();execute('DELETE FROM history WHERE line={0}和session={1}'。格式(128,session_id));In[128]=Out[128]='';
出[129]:
In[130]:history-l3-n
126:历史-l 3-n
127:历史-l 3-n
129:hismgr=get\u ipython().history\u manager;session_id=hismgr.get_last_session_id();execute('DELETE FROM history WHERE line={0}和session={1}'。格式(128,session_id));In[128]=Out[128]='';
历史行128不见了
这是我看过的一些文件
淘汰说明:这是为IPython 4.0.1
编写的
无库存方式,可添加或处理
IPython有两种历史:
readline
历史记录。可使用特殊的键/组合键(向上/向下、Ctrl-R等)。仅将输入的行(使用
)存储在控制台上(或者,在pyreadline
中,也存储从剪贴板粘贴的行)。IPython依赖于的本地实现,该实现并没有“请勿添加”功能,通常会将每一行添加到历史记录中。
IPython有一种缓解这种情况的工具,IPython.core.interactiveshell.ReadlineNoRecord
,它是一种上下文管理器,可以创建历史快照,然后将其还原。从ipython 4.0.1开始
,它仅由%run
magic使用,以避免将脚本交互输入添加到历史记录中
- 伊皮顿历史。它保存在数据库和自动变量中。它包含完整的输入(
readline
分别抓取多行的每条
'ed行)和输出。保存在HistoryManager.store\u inputs()
(用于输入)和HistoryManager.store\u output()
(用于输出)中实现,从InteractiveShell.run\u cell
调用,并由其store\u history
参数控制。后者依次从TerminalInteractiveShell.interactive
调用store\u history=True
有两种方法可以解决任一层的问题:
- 首先防止添加输入。这不能用命令的魔法前缀来完成,只能使用作为单独命令运行并切换标志的命令。这是因为,正如您所看到的,当magic命令获得控制时,当前输入已经被存储
- readline:公共API中没有相关条目,因此它是特定于实现的。例如,对于
pyreadline
,使用pyreadline.modes.basemode.basemode.add_history()
完成添加。模式对象可以通过getipython().readline.rl.mode
访问
- 装饰
运行单元
和添加历史
,使用包装器检查相应对象中的标志,以及设置/切换这些标志的控件应该可以完成这一任务
- 执行后立即从历史记录中自动删除证据输入/输出。这可以通过前缀magic实现
- IPython:
HistoryManager
没有任何工具可以删除条目(既不从DB中删除,也不从变量中删除)。唉,手工破解数据库/更换股票HistoryManager
是必要的。还要注意,该类有一个可选的缓存HistoryManager.db\u cache\u size
(默认情况下禁用)
- readline:
remove\u history\u项目(索引)
在API中。您需要知道输入中的行数
可选地,如果您只需要输入密码,就可以考虑其他不在屏幕上回传密码的方法(这样就不会使它成为控制台组织的一部分)。