33

ipython%his命令输出用户最近输入的命令。是否可以在这些命令中进行搜索?像这样的东西:

[c for c in %history if c.startswith('plot')]

编辑我不是在寻找重新运行命令的方法,而是在历史列表中找到它。当然,有时我会想在找到命令后重新运行命令,无论是逐字还是修改。

EDIT搜索ctr-r然后键入plot会给出以“plot”开头的最新命令。它不会列出所有以它开头的命令。您也不能在命令的中间或末尾搜索

解决方案

在这里扩展我正在寻找的 PreludeAndFugue 的解决方案:

[l for l in  _ih if l.startswith('plot')]

在这里,if条件可以用正则表达式代替

4

7 回答 7

61

更好的是:%hist -g pattern将您过去的历史记录为pattern. 您还可以将搜索限制为当前会话或特定范围的行。看%hist?

因此,对于@BorisGorelik 的问题,您必须这样做

%hist -g plot

不幸的是你不能做

%hist -g ^plot

也不

%hist -g "^plot"
于 2013-05-31T19:05:40.620 回答
18

如果您想重新运行历史记录中的命令,请尝试Ctrl-r然后您的搜索字符串。

于 2010-07-07T11:12:17.780 回答
12

我通常发现自己想在所有以前和当前会话中搜索整个 ipython 历史记录。为此,我使用:

from IPython.core.history import HistoryAccessor
hista = HistoryAccessor()
z1 = hista.search('*numpy*corr*')
z1.fetchall()

(不要同时运行,否则您将损坏/删除您的历史记录)

ip = get_ipython()
sqlite_cursor = ip.history_manager.search('*numpy*corr*')
sqlite_cursor.fetchall()

搜索字符串不是正则表达式。iPython history_manager 使用 sqlite 的glob *搜索语法。

于 2013-12-12T19:00:50.137 回答
8

与第一个答案类似,您可以执行以下操作:

''.join(_ih).split('\n')

但是,在遍历命令历史记录项时,您可以执行以下操作。因此,您可以从中创建您的列表理解。

for item in _ih:
    print item

这记录在文档的以下部分:http: //ipython.org/ipython-doc/dev/interactive/reference.html#input-caching-system

于 2010-07-07T10:56:54.323 回答
1

有一种方法可以做到:

''.join(_ip.IP.shell.input_hist).split('\n')

或者

''.join(_ip.IP.shell.input_hist_raw).split('\n')

防止魔法膨胀。

于 2010-07-07T10:52:53.370 回答
0
from IPython.core.history import HistoryAccessor


def search_hist(pattern,
                print_matches=True,
                return_matches=True,
                wildcard=True):

    if wildcard:
        pattern = '*' + pattern + '*'
    matches = HistoryAccessor().search(pattern).fetchall()

    if not print_matches:
        return matches

    for i in matches:
        print('#' * 60)
        print(i[-1])

    if return_matches:
        return matches
于 2017-10-20T12:16:10.797 回答
0
%history [-n] [-o] [-p] [-t] [-f FILENAME] [-g [PATTERN [PATTERN ...]]]
         [-l [LIMIT]] [-u]
         [range [range ...]]

……

-g <[PATTERN [PATTERN …]]>
treat the arg as a glob pattern to search for in (full) history. This includes the saved history (almost all commands ever written). The pattern may contain ‘?’ to match one unknown character and ‘*’ to match any number of unknown characters. Use ‘%hist -g’ to show full saved history (may be very long).

示例(在我的历史中):

In [23]: hist -g cliente*aza
655/58: cliente.test.alguna.update({"orden" : 1, "nuevo" : "azafran"})
655/59: cliente.test.alguna.update({"orden" : 1} , {$set : "nuevo" : "azafran"})
655/60: cliente.test.alguna.update({"orden" : 1} , {$set : {"nuevo" : "azafran"}})

示例(在我的历史中):

In [24]: hist -g ?lie*aza
655/58: cliente.test.alguna.update({"orden" : 1, "nuevo" : "azafran"})
655/59: cliente.test.alguna.update({"orden" : 1} , {$set : "nuevo" : "azafran"})
655/60: cliente.test.alguna.update({"orden" : 1} , {$set : {"nuevo" : "azafran"}})
于 2018-11-01T09:05:53.450 回答