Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免在ipython历史记录中存储命令?_Python_Ipython_History - Fatal编程技术网

如何避免在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

在bash中,我可以通过在命令前面加一个空格来防止命令保存到bash历史记录中。我无法在ipython中使用此方法。我该如何在ipython中做同样的事情?

我想我终于明白了。这种方法并不是真的“阻止”ipython记录历史,而是实际上删除历史记录。但我认为这仍然是实现这一目标的好方法

ipython历史记录存储在
$(ipython locate)/profile\u default/history.sqlite
中的sqlite数据库中

数据库表History有四列:sessionlinesourcesource\u rawsession列显示当前会话的
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环境中重写inOut数组。我们可以把这四条线合并成一条线,一次完成这项工作如果要删除第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中。您需要知道输入中的行数

可选地,如果您只需要输入密码,就可以考虑其他不在屏幕上回传密码的方法(这样就不会使它成为控制台组织的一部分)。